da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef _SFHDR_H
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFHDR_H 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(_BLD_sfio) && !defined(_BLD_stdio)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _BLD_sfio 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Internal definitions for sfio.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _next next
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _endw endw
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _endr endr
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _endb endb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _push push
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _flags flags
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _file file
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _data data
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _size size
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _val val
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/sfio"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/mmap"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* define va_list, etc. before including sfio_t.h (sfio.h) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* some systems don't know large files */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_NO_LARGEFILE64_SOURCE) || _mips == 2 /* || __hppa */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _NO_LARGEFILE64_SOURCE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _NO_LARGEFILE64_SOURCE 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _LARGEFILE64_SOURCE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _LARGEFILE_SOURCE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_NO_LARGEFILE64_SOURCE && _typ_off64_t && _lib_lseek64 && _lib_stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _LARGEFILE64_SOURCE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _LARGEFILE_SOURCE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _FILE_OFFSET_BITS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _LARGEFILE64_SOURCE 1 /* enabling the *64 stuff */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _LARGEFILE_SOURCE 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_stdarg
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stdarg.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <varargs.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/common"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !__STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define const
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* !_PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "sfio_t.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* note that the macro vt_threaded has effect on vthread.h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <vthread.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* file system info */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast_time.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast_tty.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* ast always provides multibyte handling */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_wchar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_mbrtowc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_wcrtomb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _hdr_wchar 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _lib_mbrtowc 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _lib_wcrtomb 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _mem_st_blksize_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _stat_blksize 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_localeconv && _hdr_locale
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _lib_locale 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfoff_t off_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfstat_t struct stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysclosef close
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syscreatf creat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysdupf dup
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysfcntlf fcntl
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysfstatf fstat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysftruncatef ftruncate
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syslseekf lseek
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysmmapf mmap
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysmunmapf munmap
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysopenf open
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syspipef pipe
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysreadf read
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysremovef remove
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysstatf stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syswritef write
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /*!_PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* when building the binary compatibility package, a number of header files
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin are not needed and they may get in the way so we remove them here.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _SFBINARY_H
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_filio
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_filio
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_poll
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _stream_peek
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _socket_peek
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_values
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_math
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_mman
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_mman
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_ioctl
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_stdlib
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stdlib.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_string
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <string.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <time.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/time.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/stat.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stat.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef _sys_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _sys_stat 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_sys_stat*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef _sys_stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _sys_stat 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <fcntl.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef F_SETFD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef FIOCLEX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_filio
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <filio.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_filio
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/filio.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_sys_filio*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_hdr_filio*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_FIOCLEX*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*F_SETFD*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_unistd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <unistd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_LARGEFILE64_SOURCE /* turn off the *64 stuff */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _typ_off64_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _typ_struct_stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_creat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_open64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_close64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_fstat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_ftruncate64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_lseek64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_mmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_munmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!_LARGEFILE64_SOURCE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* see if we can use memory mapping for io */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _LARGEFILE64_SOURCE && !_lib_mmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _mmap_worthy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_mmap_worthy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _hdr_mman
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _sys_mman
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_mman
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <mman.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_mman
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/mman.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* standardize system calls and types dealing with files */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _typ_off64_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfoff_t off64_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfoff_t off_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _typ_struct_stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfstat_t struct stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfstat_t struct stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_lseek64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syslseekf lseek64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syslseekf lseek
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysstatf stat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysstatf stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_fstat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysfstatf fstat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysfstatf fstat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_mmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysmmapf mmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysmmapf mmap
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_munmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysmunmapf munmap64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysmunmapf munmap
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_open64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysopenf open64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysopenf open
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_creat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syscreatf creat64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syscreatf creat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_close64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysclosef close64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysclosef close
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_ftruncate64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_ftruncate
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _lib_ftruncate 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysftruncatef ftruncate64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_lib_ftruncate64 && _lib_ftruncate
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysftruncatef ftruncate
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_remove
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysremovef remove
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysremovef unlink
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysreadf read
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syswritef write
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define syspipef pipe
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysdupf dup
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sysfcntlf fcntl
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_mmap_worthy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MAP_TYPE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/float"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <errno.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ctype.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* deal with multi-byte character and string conversions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <wchar.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _has_multibyte 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBMAX mbmax()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCLR(mb) memset((mb), 0, sizeof(mbstate_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBSET(lhs,v) (lhs = (v))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBLEN(s,mb) mbsize(s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBDCL(ms) mbstate_t ms;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _has_multibyte 1 /* Xopen-compliant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <wchar.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCPY(to,fr) memcpy((to), (fr), sizeof(mbstate_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCLR(mb) memset((mb), 0, sizeof(mbstate_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBSET(lhs,v) (lhs = (v))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBDCL(mb) mbstate_t mb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_hdr_wchar && _typ_mbstate_t && _lib_wcrtomb && _lib_mbrtowc*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _has_multibyte 2 /* no shift states */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <wchar.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef mbrtowc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define mbrtowc(wp,s,n,mb) mbtowc(wp, s, n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef wcrtomb
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define wcrtomb(s,wc,mb) wctomb(s, wc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCPY(to,fr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCLR(mb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBSET(lhs,v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBDCL(mb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBLEN(s,mb) mbrtowc(NIL(wchar_t*), (s), SFMBMAX, (mb) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!_has_multibyte && _hdr_wchar && _lib_mbtowc && _lib_wctomb*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef MB_CUR_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBMAX MB_CUR_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBMAX sizeof(Sflong_t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_has_multibyte
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _has_multibyte 0 /* no multibyte support */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCPY(to,fr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBCLR(mb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBSET(lhs,v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBLEN(s,mb) (*(s) ? 1 : 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMBDCL(mb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _has_multibyte */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* dealing with streams that might be accessed concurrently */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if vt_threaded
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXdecl(ff,_mf_) Sfio_t* _mf_ = (ff)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXbegin(ff,_mf_,rv) \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { if((ff)->_flags&SF_MTSAFE) \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { (_mf_) = (ff); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sfmutex((ff), SFMTX_LOCK) != 0) return(rv); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(_Sfnotify) \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { (*_Sfnotify)((_mf_), SF_MTACCESS, (Void_t*)(&(ff)) ); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(ff)) (ff) = (_mf_); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin } \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin } \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXend(ff,_mf_) \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { if((ff)->_flags&SF_MTSAFE) \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { if(_Sfnotify) \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (*_Sfnotify)((_mf_), SF_MTACCESS, NIL(Void_t*) ); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfmutex((ff), SFMTX_UNLOCK); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (ff) = (_mf_); \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin } \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFONCE() (_Sfdone ? 0 : vtonce(_Sfonce,_Sfoncef))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_LOCK) : 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXUNLOCK(f) (((f)->flags&SF_MTSAFE) ? sfmutex(f,SFMTX_UNLOCK) : 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXDECL(ff) SFMTXdecl((ff), _mtxf1_)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXBEGIN(ff,v) { SFMTXbegin((ff), _mtxf1_, (v) ); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXEND(ff) { SFMTXend(ff, _mtxf1_); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXENTER(ff,v) { if(!(ff)) return(v); SFMTXBEGIN((ff), (v)); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXRETURN(ff,v) { SFMTXEND(ff); return(v); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXDECL2(ff) SFMTXdecl((ff), _mtxf2_)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXBEGIN2(ff,v) { SFMTXbegin((ff), _mtxf2_, (v) ); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXEND2(ff) { SFMTXend((ff), _mtxf2_); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define POOLMTXLOCK(p) ( vtmtxlock(&(p)->mutex) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define POOLMTXUNLOCK(p) ( vtmtxunlock(&(p)->mutex) )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define POOLMTXENTER(p) { POOLMTXLOCK(p); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define POOLMTXRETURN(p,rv) { POOLMTXUNLOCK(p); return(rv); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /*!vt_threaded*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SF_MTSAFE /* no need to worry about thread-safety */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MTSAFE 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFONCE() /*(0)*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMTXLOCK(f) /*(0)*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMTXUNLOCK(f) /*(0)*/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXDECL(ff) /*(0)*/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXBEGIN(ff,v) /*(0)*/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXEND(ff) /*(0)*/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXENTER(ff,v) { if(!(ff)) return(v); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXRETURN(ff,v) { return(v); }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXDECL2(ff) /*(0)*/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXBEGIN2(ff,v) /*(0)*/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define SFMTXEND2(ff) /*(0)*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define POOLMTXLOCK(p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define POOLMTXUNLOCK(p)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define POOLMTXENTER(p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define POOLMTXRETURN(p,v) { return(v); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*vt_threaded*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* functions for polling readiness of streams */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_select
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _lib_poll
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_poll_fd_1 || _lib_poll_fd_2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _lib_poll 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_select_*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_poll
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <poll.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_poll_fd_1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFPOLL(pfd,n,tm) poll((pfd),(ulong)(n),(tm))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFPOLL(pfd,n,tm) poll((ulong)(n),(pfd),(tm))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_poll*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _stream_peek
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stropts.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _socket_peek
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/socket.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* to test for executable access mode of a file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef X_OK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define X_OK 01
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* alternative process forking */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_vfork && !defined(fork) && !defined(sparc) && !defined(__sparc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _hdr_vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <vfork.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _sys_vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/vfork.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fork vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* to get rid of pesky compiler warnings */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NOTUSED(x) (void)(x)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NOTUSED(x) (&x,1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Private flags in the "bits" field */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MMAP 00000001 /* in memory mapping mode */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_BOTH 00000002 /* both read/write */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_HOLE 00000004 /* a hole of zero's was created */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_NULL 00000010 /* stream is /dev/null */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_SEQUENTIAL 00000020 /* sequential access */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_JUSTSEEK 00000040 /* just did a sfseek */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PRIVATE 00000100 /* private stream to Sfio, no mutex */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_ENDING 00000200 /* no re-io on interrupts at closing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_WIDE 00000400 /* in wide mode - stdio only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* "bits" flags that must be cleared in sfclrlock */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_TMPBITS 00170000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_DCDOWN 00010000 /* recurse down the discipline stack */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_WCFORMAT 00020000 /* wchar_t formatting - stdio only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _has_multibyte
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWCSET(f) ((f)->bits |= SF_WCFORMAT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWCGET(f,v) (((v) = (f)->bits & SF_WCFORMAT), ((f)->bits &= ~SF_WCFORMAT) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWCSET(f)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWCGET(f,v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MVSIZE 00040000 /* f->size was reset in sfmove() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMVSET(f) (((f)->size *= SF_NMAP), ((f)->bits |= SF_MVSIZE) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMVUNSET(f) (!((f)->bits&SF_MVSIZE) ? 0 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (((f)->bits &= ~SF_MVSIZE), ((f)->size /= SF_NMAP)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFCLRBITS(f) (SFMVUNSET(f), ((f)->bits &= ~SF_TMPBITS) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* bits for the mode field, SF_INIT defined in sfio_t.h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_RC 00000010 /* peeking for a record */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_RV 00000020 /* reserve without read or most write */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_LOCK 00000040 /* stream is locked for io op */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PUSH 00000100 /* stream has been pushed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_POOL 00000200 /* stream is in a pool but not current */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PEEK 00000400 /* there is a pending peek */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PKRD 00001000 /* did a peek read */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_GETR 00002000 /* did a getr on this stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_SYNCED 00004000 /* stream was synced */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_STDIO 00010000 /* given up the buffer to stdio */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_AVAIL 00020000 /* was closed, available for reuse */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_LOCAL 00100000 /* sentinel for a local call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef DEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ASSERT(p) ((p) ? 0 : (abort(),0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ASSERT(p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* short-hands */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NIL(t) ((t)0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define reg register
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef uchar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define uchar unsigned char
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ulong
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ulong unsigned long
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef uint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define uint unsigned int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ushort
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ushort unsigned short
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SECOND 1000 /* millisecond units */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* macros do determine stream types from sfstat_t data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_IFMT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_IFMT 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_IFDIR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_IFDIR 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_IFREG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_IFREG 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_IFCHR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_IFCHR 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_IFIFO
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_IFIFO 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_ISDIR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_ISREG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_ISREG(m) (((m)&S_IFMT) == S_IFREG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_ISCHR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_ISCHR(m) (((m)&S_IFMT) == S_IFCHR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef S_ISFIFO
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef S_IFIFO
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# define S_ISFIFO(m) (((m)&S_IFMT) == S_IFIFO)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define S_ISFIFO(m) (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef S_IRUSR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_CREATMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_CREATMODE 0666
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set close-on-exec */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef F_SETFD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifndef FD_CLOEXEC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define FD_CLOEXEC 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /*FD_CLOEXEC*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define SETCLOEXEC(fd) ((void)fcntl((fd),F_SETFD,FD_CLOEXEC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef FIOCLEX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define SETCLOEXEC(fd) ((void)ioctl((fd),FIOCLEX,0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define SETCLOEXEC(fd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /*FIOCLEX*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*F_SETFD*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* a couple of error number that we use, default values are like Linux */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef EINTR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EINTR 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef EBADF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EBADF 9
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef EAGAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EAGAIN 11
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ENOMEM
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ENOMEM 12
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef EINVAL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EINVAL 22
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ESPIPE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ESPIPE 29
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* function to get the decimal point for local environment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(SFSETLOCALE) && _PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "lclib.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSETLOCALE(dp,tp) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do if (*(dp) == 0) { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_numeric_t* lv = (Lc_numeric_t*)LCINFO(AST_LC_NUMERIC)->data; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(dp) = lv->decimal; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp) *(tp) = lv->thousand; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!defined(SFSETLOCALE) && _PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(SFSETLOCALE) && _lib_locale
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <locale.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSETLOCALE(decimal,thousand) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do { struct lconv* lv; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(decimal) == 0) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { *(decimal) = '.'; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (thousand) *(thousand) = -1; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((lv = localeconv())) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(lv->decimal_point && *lv->decimal_point) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(decimal) = *(unsigned char*)lv->decimal_point; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(thousand && lv->thousands_sep && *lv->thousands_sep) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(thousand) = *(unsigned char*)lv->thousands_sep; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*!defined(SFSETLOCALE) && _lib_locale*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(SFSETLOCALE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSETLOCALE(decimal,thousand) (*(decimal)='.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* stream pool structure. */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _sfpool_s Sfpool_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _sfpool_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Sfpool_t* next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int mode; /* type of pool */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int s_sf; /* size of pool array */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int n_sf; /* number currently in pool */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t** sf; /* array of streams */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t* array[3]; /* start with 3 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vtmutex_t mutex; /* mutex lock object */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* reserve buffer structure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _sfrsrv_s Sfrsrv_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _sfrsrv_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ ssize_t slen; /* last string length */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ssize_t size; /* buffer size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar data[1]; /* data buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* co-process structure */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _sfproc_s Sfproc_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _sfproc_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ int pid; /* process id */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar* rdata; /* read data being cached */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int ndata; /* size of cached data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int size; /* buffer size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int file; /* saved file descriptor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sigp; /* sigpipe protection needed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* extensions to sfvprintf/sfvscanf */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_SET(fp,fn) (fp < 0 ? (fn += 1) : (fn = fp) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_WIDTH 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_PRECIS 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_BASE 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_STR 3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_SIZE 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FP_INDEX 5 /* index size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _fmt_s Fmt_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _fmtpos_s Fmtpos_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef union
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ int i, *ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long l, *lp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin short h, *hp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uint ui;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ulong ul;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ushort uh;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sflong_t ll, *llp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfulong_t lu;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t ld;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double d;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin float f;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _has_multibyte
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin wchar_t wc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin wchar_t *ws, **wsp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char c, *s, **sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar uc, *us, **usp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Void_t *vp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sffmt_t *ft;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Argv_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _fmt_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ char* form; /* format string */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin va_list args; /* corresponding arglist */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFMBDCL(mbs) /* multibyte parsing state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* oform; /* original format string */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin va_list oargs; /* original arg list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int argn; /* number of args already used */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Fmtpos_t* fp; /* position list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sffmt_t* ft; /* formatting environment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sffmtevent_f eventf; /* event function */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Fmt_t* next; /* stack frame pointer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _fmtpos_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Sffmt_t ft; /* environment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Argv_t argv; /* argument value */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int fmt; /* original format */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int need[FP_INDEX]; /* positions depending on */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LEFTP '('
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RIGHTP ')'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QUOTE '\''
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef CHAR_BIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CHAR_BIT 8
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FMTSET(ft, frm,ags, fv, sz, flgs, wid,pr,bs, ts,ns) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((ft->form = (char*)frm), va_copy(ft->args,ags), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (ft->fmt = fv), (ft->size = sz), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (ft->flags = (flgs&SFFMT_SET)), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (ft->width = wid), (ft->precis = pr), (ft->base = bs), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (ft->t_str = ts), (ft->n_str = ns) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FMTGET(ft, frm,ags, fv, sz, flgs, wid,pr,bs) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((frm = ft->form), va_copy(ags,ft->args), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (fv = ft->fmt), (sz = ft->size), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (flgs = (flgs&~(SFFMT_SET))|(ft->flags&SFFMT_SET)), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (wid = ft->width), (pr = ft->precis), (bs = ft->base) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* format flags&types, must coexist with those in sfio.h */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_FORBIDDEN 000077777777 /* for sfio.h only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_EFORMAT 001000000000 /* sfcvt converting %e */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_MINUS 002000000000 /* minus sign */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_AFORMAT 004000000000 /* sfcvt converting %a */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_UPPER 010000000000 /* sfcvt converting upper */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_TYPES (SFFMT_SHORT|SFFMT_SSHORT | SFFMT_LONG|SFFMT_LLONG|\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFFMT_LDOUBLE | SFFMT_IFLAG|SFFMT_JFLAG| \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFFMT_TFLAG | SFFMT_ZFLAG )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* type of elements to be converted */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_INT 001 /* %d,%i */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_UINT 002 /* %u,o,x etc. */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_FLOAT 004 /* %f,e,g etc. */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_CHAR 010 /* %c,C */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_POINTER 020 /* %p,n,s,S */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFMT_CLASS 040 /* %[ */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* local variables used across sf-functions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfpage (_Sfextern.sf_page)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfpool (_Sfextern.sf_pool)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfpmove (_Sfextern.sf_pmove)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfstack (_Sfextern.sf_stack)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfnotify (_Sfextern.sf_notify)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfstdsync (_Sfextern.sf_stdsync)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfudisc (&(_Sfextern.sf_udisc))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfcleanup (_Sfextern.sf_cleanup)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfexiting (_Sfextern.sf_exiting)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfdone (_Sfextern.sf_done)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfonce (_Sfextern.sf_once)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfoncef (_Sfextern.sf_oncef)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfmutex (_Sfextern.sf_mutex)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _sfextern_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ ssize_t sf_page;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct _sfpool_s sf_pool;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int (*sf_pmove)_ARG_((Sfio_t*, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t* (*sf_stack)_ARG_((Sfio_t*, Sfio_t*));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin void (*sf_notify)_ARG_((Sfio_t*, int, void*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int (*sf_stdsync)_ARG_((Sfio_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct _sfdisc_s sf_udisc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void (*sf_cleanup)_ARG_((void));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sf_exiting;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sf_done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vtonce_t* sf_once;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void (*sf_oncef)_ARG_((void));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Vtmutex_t* sf_mutex;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Sfextern_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* get the real value of a byte in a coded long or ulong */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFUVALUE(v) (((ulong)(v))&(SF_MORE-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSVALUE(v) ((( long)(v))&(SF_SIGN-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFBVALUE(v) (((ulong)(v))&(SF_BYTE-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* pick this many bits in each iteration of double encoding */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PRECIS 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* grain size for buffer increment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_GRAIN 1024
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_PAGE ((ssize_t)(SF_GRAIN*sizeof(int)*2))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* when the buffer is empty, certain io requests may be better done directly
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin on the given application buffers. The below condition determines when.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFDIRECT(f,n) (((ssize_t)(n) >= (f)->size) || \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((n) >= SF_GRAIN && (ssize_t)(n) >= (f)->size/16 ) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* number of pages to memory map at a time */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_NMAP 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef MAP_VARIABLE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAP_VARIABLE 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef _mmap_fixed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _mmap_fixed 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set/unset sequential states for mmap */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_madvise && defined(MADV_SEQUENTIAL) && defined(MADV_NORMAL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMMSEQON(f,a,s) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do { int oerrno = errno; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)madvise((caddr_t)(a),(size_t)(s),MADV_SEQUENTIAL); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = oerrno; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMMSEQOFF(f,a,s) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do { int oerrno = errno; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)madvise((caddr_t)(a),(size_t)(s),MADV_NORMAL); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = oerrno; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMMSEQON(f,a,s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMMSEQOFF(f,a,s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMUNMAP(f,a,s) (sysmunmapf((caddr_t)(a),(size_t)(s)), \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((f)->endb = (f)->endr = (f)->endw = (f)->next = \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (f)->data = NIL(uchar*)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* safe closing function */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CLOSE(f) { while(sysclosef(f) < 0 && errno == EINTR) errno = 0; }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* the bottomless bit bucket */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DEVNULL "/dev/null"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSETNULL(f) ((f)->extent = (Sfoff_t)(-1), (f)->bits |= SF_NULL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFISNULL(f) ((f)->extent < 0 && ((f)->bits&SF_NULL) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFKILL(f) ((f)->mode = (SF_AVAIL|SF_LOCK) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFKILLED(f) (((f)->mode&(SF_AVAIL|SF_LOCK)) == (SF_AVAIL|SF_LOCK) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* exception types */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_EDONE 0 /* stop this operation and return */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_EDISC 1 /* discipline says it's ok */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_ESTACK 2 /* stack was popped */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_ECONT 3 /* can continue normally */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SETLOCAL(f) ((f)->mode |= SF_LOCAL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GETLOCAL(f,v) ((v) = ((f)->mode&SF_LOCAL), (f)->mode &= ~SF_LOCAL, (v))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWRALL(f) ((f)->mode |= SF_RV)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFISALL(f,v) ((((v) = (f)->mode&SF_RV) ? ((f)->mode &= ~SF_RV) : 0), \
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ((v) || ((f)->flags&(SF_SHARE|SF_APPENDWR|SF_WHOLE)) ) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSK(f,a,o,d) (SETLOCAL(f),sfsk(f,(Sfoff_t)a,o,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFRD(f,b,n,d) (SETLOCAL(f),sfrd(f,(Void_t*)b,n,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWR(f,b,n,d) (SETLOCAL(f),sfwr(f,(Void_t*)b,n,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSYNC(f) (SETLOCAL(f),sfsync(f))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFCLOSE(f) (SETLOCAL(f),sfclose(f))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFLSBUF(f,n) (SETLOCAL(f),_sfflsbuf(f,n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFILBUF(f,n) (SETLOCAL(f),_sffilbuf(f,n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSETBUF(f,s,n) (SETLOCAL(f),sfsetbuf(f,s,n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWRITE(f,s,n) (SETLOCAL(f),sfwrite(f,s,n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFREAD(f,s,n) (SETLOCAL(f),sfread(f,s,n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSEEK(f,p,t) (SETLOCAL(f),sfseek(f,p,t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFNPUTC(f,c,n) (SETLOCAL(f),sfnputc(f,c,n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFRAISE(f,e,d) (SETLOCAL(f),sfraise(f,e,d))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* lock/open a stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFMODE(f,l) ((f)->mode & ~(SF_RV|SF_RC|((l) ? SF_LOCK : 0)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFLOCK(f,l) (void)((f)->mode |= SF_LOCK, (f)->endr = (f)->endw = (f)->data)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFOPENRD(f) ((f)->endr = ((f)->flags&SF_MTSAFE) ? (f)->data : (f)->endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFOPENWR(f) ((f)->endw = ((f)->flags&(SF_MTSAFE|SF_LINE)) ? (f)->data : (f)->endb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFOPEN(f) ((f)->mode == SF_READ ? _SFOPENRD(f) : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (f)->mode == SF_WRITE ? _SFOPENWR(f) : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((f)->endw = (f)->endr = (f)->data) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFOPEN(f,l) (void)((l) ? 0 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((f)->mode &= ~(SF_LOCK|SF_RC|SF_RV), _SFOPEN(f), 0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* check to see if the stream can be accessed */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFFROZEN(f) (((f)->mode&(SF_PUSH|SF_LOCK|SF_PEEK)) ? 1 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !((f)->mode&SF_STDIO) ? 0 : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _Sfstdsync ? (*_Sfstdsync)(f) : (((f)->mode &= ~SF_STDIO),0) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* set discipline code */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFDISC(f,dc,iof) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { Sfdisc_t* d; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(dc)) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin d = (dc) = (f)->disc; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else d = (f->bits&SF_DCDOWN) ? ((dc) = (dc)->disc) : (dc); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(d && !(d->iof)) d = d->disc; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(d) (dc) = d; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFDCRD(f,buf,n,dc,rv) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv = (*dc->readf)(f,buf,n,dc); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!dcdown) f->bits &= ~SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFDCWR(f,buf,n,dc,rv) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv = (*dc->writef)(f,buf,n,dc); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!dcdown) f->bits &= ~SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFDCSK(f,addr,type,dc,rv) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { int dcdown = f->bits&SF_DCDOWN; f->bits |= SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rv = (*dc->seekf)(f,addr,type,dc); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!dcdown) f->bits &= ~SF_DCDOWN; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* fast peek of a stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _SFAVAIL(f,s,n) ((n) = (f)->endb - ((s) = (f)->next) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFRPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((n) = SFFILBUF(f,-1), (s) = (f)->next, (n)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFWPEEK(f,s,n) (_SFAVAIL(f,s,n) > 0 ? (n) : \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((n) = SFFLSBUF(f,-1), (s) = (f)->next, (n)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* more than this for a line buffer, we might as well flush */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIFORLINE 128
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* string stream extent */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFSTRSIZE(f) { Sfoff_t s = (f)->next - (f)->data; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(s > (f)->here) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { (f)->here = s; if(s > (f)->extent) (f)->extent = s; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* control flags for open() */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef O_CREAT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _has_oflags 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /* for example, research UNIX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _has_oflags 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_CREAT 004
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_TRUNC 010
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_APPEND 020
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_EXCL 040
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef O_RDONLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_RDONLY 000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef O_WRONLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_WRONLY 001
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef O_RDWR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_RDWR 002
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*O_CREAT*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef O_BINARY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_BINARY 000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef O_TEXT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_TEXT 000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef O_TEMPORARY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define O_TEMPORARY 000
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_RADIX 64 /* maximum integer conversion base */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXINT INT_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXLONG LONG_MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXINT ((int)(((uint)~0) >> 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXLONG ((long)(((ulong)~0L) >> 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXCHAR ((uchar)(~0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* floating point to ascii conversion */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXEXP10 6
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXPOW10 (1 << SF_MAXEXP10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_ast_fltmax_double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_FDIGITS 1024 /* max allowed fractional digits */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_IDIGITS (8*1024) /* max number of digits in int part */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_FDIGITS 256 /* max allowed fractional digits */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_IDIGITS 1024 /* max number of digits in int part */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SF_MAXDIGITS (((SF_FDIGITS+SF_IDIGITS)/sizeof(int) + 1)*sizeof(int))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* tables for numerical translation */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfpos10 (_Sftable.sf_pos10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfneg10 (_Sftable.sf_neg10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfdec (_Sftable.sf_dec)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfdigits (_Sftable.sf_digits)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfcvinitf (_Sftable.sf_cvinitf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfcvinit (_Sftable.sf_cvinit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sffmtposf (_Sftable.sf_fmtposf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sffmtintf (_Sftable.sf_fmtintf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfcv36 (_Sftable.sf_cv36)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfcv64 (_Sftable.sf_cv64)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sftype (_Sftable.sf_type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfieee (&_Sftable.sf_ieee)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sffinf (_Sftable.sf_ieee.fltinf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfdinf (_Sftable.sf_ieee.dblinf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sflinf (_Sftable.sf_ieee.ldblinf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sffnan (_Sftable.sf_ieee.fltnan)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfdnan (_Sftable.sf_ieee.dblnan)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sflnan (_Sftable.sf_ieee.ldblnan)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sffpow10 (_Sftable.sf_flt_pow10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sfdpow10 (_Sftable.sf_dbl_pow10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _Sflpow10 (_Sftable.sf_ldbl_pow10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _sfieee_s Sfieee_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct _sfieee_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ float fltnan; /* float NAN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin float fltinf; /* float INF */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double dblnan; /* double NAN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double dblinf; /* double INF */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t ldblnan; /* Sfdouble_t NAN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t ldblinf; /* Sfdouble_t INF */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct _sftab_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{ Sfdouble_t sf_pos10[SF_MAXEXP10]; /* positive powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t sf_neg10[SF_MAXEXP10]; /* negative powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_dec[200]; /* ascii reps of values < 100 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* sf_digits; /* digits for general bases */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int (*sf_cvinitf)(); /* initialization function */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sf_cvinit; /* initialization state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Fmtpos_t* (*sf_fmtposf)_ARG_((Sfio_t*,const char*,va_list,Sffmt_t*,int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* (*sf_fmtintf)_ARG_((const char*,int*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin float* sf_flt_pow10; /* float powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin double* sf_dbl_pow10; /* double powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t* sf_ldbl_pow10; /* Sfdouble_t powers of 10 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_cv36[SF_MAXCHAR+1]; /* conversion for base [2-36] */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_cv64[SF_MAXCHAR+1]; /* conversion for base [37-64] */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar sf_type[SF_MAXCHAR+1]; /* conversion formats&types */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfieee_t sf_ieee; /* IEEE floating point constants*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Sftab_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* thread-safe macro/function to initialize _Sfcv* conversion tables */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFCVINIT() (_Sfcvinit ? 1 : (_Sfcvinit = (*_Sfcvinitf)()) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* sfucvt() converts decimal integers to ASCII */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SFDIGIT(v,scale,digit) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(v < 5*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(v < 2*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(v < 1*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { digit = '0'; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else { digit = '1'; v -= 1*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(v < 3*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { digit = '2'; v -= 2*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(v < 4*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { digit = '3'; v -= 3*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else { digit = '4'; v -= 4*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(v < 7*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(v < 6*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { digit = '5'; v -= 5*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else { digit = '6'; v -= 6*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(v < 8*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { digit = '7'; v -= 7*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(v < 9*scale) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { digit = '8'; v -= 8*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else { digit = '9'; v -= 9*scale; } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sfucvt(v,s,n,list,type,utype) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { while((utype)v >= 10000) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { n = v; v = (type)(((utype)v)/10000); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (type)((utype)n - ((utype)v)*10000); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s -= 4; SFDIGIT(n,1000,s[0]); SFDIGIT(n,100,s[1]); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[2] = *(list = (char*)_Sfdec + (n <<= 1)); s[3] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(v < 100) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(v < 10) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { s -= 1; s[0] = (char)('0'+v); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } else \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { s -= 2; s[0] = *(list = (char*)_Sfdec + (v <<= 1)); s[1] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } else \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(v < 1000) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { s -= 3; SFDIGIT(v,100,s[0]); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[1] = *(list = (char*)_Sfdec + (v <<= 1)); s[2] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } else \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { s -= 4; SFDIGIT(v,1000,s[0]); SFDIGIT(v,100,s[1]); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[2] = *(list = (char*)_Sfdec + (v <<= 1)); s[3] = *(list+1); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* handy functions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef min
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef max
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define min(x,y) ((x) < (y) ? (x) : (y))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define max(x,y) ((x) > (y) ? (x) : (y))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* fast functions for memory copy and memory clear */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define memclear(s,n) memzero(s,n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_bcopy && !_lib_memcpy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define memcpy(to,fr,n) bcopy((fr),(to),(n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_bzero && !_lib_memset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define memclear(s,n) bzero((s),(n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define memclear(s,n) memset((s),'\0',(n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_PACKAGE_ast*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* note that MEMCPY advances the associated pointers */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MEMCPY(to,fr,n) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(n) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { default : memcpy((Void_t*)to,(Void_t*)fr,n); to += n; fr += n; break; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 7 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 6 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 5 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 4 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 3 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 2 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 1 : *to++ = *fr++; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MEMSET(s,c,n) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(n) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { default : memset((Void_t*)s,(int)c,n); s += n; break; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 7 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 6 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 5 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 4 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 3 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 2 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 1 : *s++ = c; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin_BEGIN_EXTERNS_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sftab_t _Sftable;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfpopen _ARG_((Sfio_t*, int, int, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfpclose _ARG_((Sfio_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfexcept _ARG_((Sfio_t*, int, ssize_t, Sfdisc_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfrsrv_t* _sfrsrv _ARG_((Sfio_t*, ssize_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfsetpool _ARG_((Sfio_t*));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinextern char* _sfcvt _ARG_((Void_t*,char*,size_t,int,int*,int*,int*,int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern char** _sfgetpath _ARG_((char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _BLD_sfio && defined(__EXPORT__)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_BLD_sfio && defined(__IMPORT__)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern extern __IMPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfextern_t _Sfextern;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sfmode _ARG_((Sfio_t*, int, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int _sftype _ARG_((const char*, int*, int*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef extern
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef errno
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int errno;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* for portable encoding of double values */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef frexpl
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _ast_fltmax_double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define frexpl frexp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !__STDC__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfdouble_t frexpl _ARG_((Sfdouble_t, int*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef ldexpl
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _ast_fltmax_double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ldexpl ldexp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !__STDC__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sfdouble_t ldexpl _ARG_((Sfdouble_t, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_PACKAGE_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !__STDC__ && !_hdr_stdlib
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void abort _ARG_((void));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int atexit _ARG_((void(*)(void)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern char* getenv _ARG_((const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void* malloc _ARG_((size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void* realloc _ARG_((void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void free _ARG_((void*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern size_t strlen _ARG_((const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern char* strcpy _ARG_((char*, const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memset _ARG_((void*, int, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memchr _ARG_((const void*, int, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memccpy _ARG_((void*, const void*, int, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef memcpy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Void_t* memcpy _ARG_((void*, const void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(strtod)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern double strtod _ARG_((const char*, char**));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(remove)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysremovef _ARG_((const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* !__STDC__ && !_hdr_stdlib */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_hdr_unistd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _proto_open && __cplusplus
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysopenf _ARG_((const char*, int, ...));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysclosef _ARG_((int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t sysreadf _ARG_((int, void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern ssize_t syswritef _ARG_((int, const void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern sfoff_t syslseekf _ARG_((int, sfoff_t, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysdupf _ARG_((int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int syspipef _ARG_((int*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysaccessf _ARG_((const char*, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysremovef _ARG_((const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysfstatf _ARG_((int, sfstat_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int sysstatf _ARG_((const char*, sfstat_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int isatty _ARG_((int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int wait _ARG_((int*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern uint sleep _ARG_((uint));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int execl _ARG_((const char*, const char*,...));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int execv _ARG_((const char*, char**));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(fork)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int fork _ARG_((void));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_unlink
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int unlink _ARG_((const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_hdr_unistd*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_bcopy && !_proto_bcopy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void bcopy _ARG_((const void*, void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_bzero && !_proto_bzero
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void bzero _ARG_((void*, size_t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern time_t time _ARG_((time_t*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int waitpid _ARG_((int,int*,int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void _exit _ARG_((int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef int(* Onexit_f)_ARG_((void));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Onexit_f onexit _ARG_((Onexit_f));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_vfork && !_hdr_vfork && !_sys_vfork
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern pid_t vfork _ARG_((void));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_vfork*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_poll
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_poll_fd_1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int poll _ARG_((struct pollfd*, ulong, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int poll _ARG_((ulong, struct pollfd*, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_lib_poll*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _PACKAGE_ast */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin_END_EXTERNS_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*_SFHDR_H*/