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