155b5af84SJoerg Sonnenberger /*- 255b5af84SJoerg Sonnenberger * Copyright (c) 1990, 1993 355b5af84SJoerg Sonnenberger * The Regents of the University of California. All rights reserved. 455b5af84SJoerg Sonnenberger * Copyright (c) 2005 Joerg Sonnenberger <joerg@bec.de>. All rights reserved. 555b5af84SJoerg Sonnenberger * 655b5af84SJoerg Sonnenberger * This code is derived from software contributed to Berkeley by 755b5af84SJoerg Sonnenberger * Chris Torek. 855b5af84SJoerg Sonnenberger * 955b5af84SJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without 1055b5af84SJoerg Sonnenberger * modification, are permitted provided that the following conditions 1155b5af84SJoerg Sonnenberger * are met: 1255b5af84SJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright 1355b5af84SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer. 1455b5af84SJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright 1555b5af84SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in the 1655b5af84SJoerg Sonnenberger * documentation and/or other materials provided with the distribution. 1755b5af84SJoerg Sonnenberger * 3. Neither the name of the University nor the names of its contributors 1855b5af84SJoerg Sonnenberger * may be used to endorse or promote products derived from this software 1955b5af84SJoerg Sonnenberger * without specific prior written permission. 2055b5af84SJoerg Sonnenberger * 2155b5af84SJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2255b5af84SJoerg Sonnenberger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355b5af84SJoerg Sonnenberger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455b5af84SJoerg Sonnenberger * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2555b5af84SJoerg Sonnenberger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655b5af84SJoerg Sonnenberger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755b5af84SJoerg Sonnenberger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855b5af84SJoerg Sonnenberger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955b5af84SJoerg Sonnenberger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055b5af84SJoerg Sonnenberger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155b5af84SJoerg Sonnenberger * SUCH DAMAGE. 3255b5af84SJoerg Sonnenberger * 336f1e2b38SJoerg Sonnenberger * $DragonFly: src/lib/libc/stdio/priv_stdio.h,v 1.3 2005/08/02 00:44:39 joerg Exp $ 3455b5af84SJoerg Sonnenberger */ 3555b5af84SJoerg Sonnenberger 3655b5af84SJoerg Sonnenberger #ifndef _LIBC_PRIV_STDIO_H_ 3755b5af84SJoerg Sonnenberger #define _LIBC_PRIV_STDIO_H_ 3855b5af84SJoerg Sonnenberger 3943f82d70SJoerg Sonnenberger #include <pthread.h> 4043f82d70SJoerg Sonnenberger 416f1e2b38SJoerg Sonnenberger #include "wcio.h" 426f1e2b38SJoerg Sonnenberger 43*e0f95098SPeter Avalos /* 44*e0f95098SPeter Avalos * NB: to fit things in six character monocase externals, the stdio 45*e0f95098SPeter Avalos * code uses the prefix `__s' for stdio objects, typically followed 46*e0f95098SPeter Avalos * by a three-character attempt at a mnemonic. 47*e0f95098SPeter Avalos */ 48*e0f95098SPeter Avalos 4955b5af84SJoerg Sonnenberger /* stdio buffers */ 5055b5af84SJoerg Sonnenberger struct __sbuf { 5155b5af84SJoerg Sonnenberger unsigned char *_base; 5255b5af84SJoerg Sonnenberger int _size; 5355b5af84SJoerg Sonnenberger }; 5455b5af84SJoerg Sonnenberger 5555b5af84SJoerg Sonnenberger /* 5655b5af84SJoerg Sonnenberger * _ub, _up, and _ur are used when ungetc() pushes back more characters 5755b5af84SJoerg Sonnenberger * than fit in the current _bf, or when ungetc() pushes back a character 5855b5af84SJoerg Sonnenberger * that does not match the previous one in _bf. When this happens, 5955b5af84SJoerg Sonnenberger * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff 6055b5af84SJoerg Sonnenberger * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. 6155b5af84SJoerg Sonnenberger */ 6255b5af84SJoerg Sonnenberger 6355b5af84SJoerg Sonnenberger struct __FILE { 6455b5af84SJoerg Sonnenberger struct __FILE_public pub; 6555b5af84SJoerg Sonnenberger struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ 6655b5af84SJoerg Sonnenberger 6755b5af84SJoerg Sonnenberger /* operations */ 6855b5af84SJoerg Sonnenberger void *_cookie; /* cookie passed to io functions */ 6955b5af84SJoerg Sonnenberger int (*_close)(void *); 7055b5af84SJoerg Sonnenberger int (*_read)(void *, char *, int); 7155b5af84SJoerg Sonnenberger fpos_t (*_seek)(void *, fpos_t, int); 7255b5af84SJoerg Sonnenberger int (*_write)(void *, const char *, int); 7355b5af84SJoerg Sonnenberger 7455b5af84SJoerg Sonnenberger /* separate buffer for long sequences of ungetc() */ 7555b5af84SJoerg Sonnenberger struct __sbuf _ub; /* ungetc buffer */ 7655b5af84SJoerg Sonnenberger int _ur; /* saved _r when _r is counting ungetc data */ 7755b5af84SJoerg Sonnenberger 7855b5af84SJoerg Sonnenberger /* tricks to meet minimum requirements even when malloc() fails */ 7955b5af84SJoerg Sonnenberger unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ 8055b5af84SJoerg Sonnenberger unsigned char _nbuf[1]; /* guarantee a getc() buffer */ 8155b5af84SJoerg Sonnenberger 8255b5af84SJoerg Sonnenberger /* separate buffer for fgetln() when line crosses buffer boundary */ 8355b5af84SJoerg Sonnenberger struct __sbuf _lb; /* buffer for fgetln() */ 8455b5af84SJoerg Sonnenberger 8555b5af84SJoerg Sonnenberger /* Unix stdio files get aligned to block boundaries on fseek() */ 8655b5af84SJoerg Sonnenberger int _blksize; /* stat.st_blksize (may be != _bf._size) */ 8755b5af84SJoerg Sonnenberger fpos_t _offset; /* current lseek offset (see WARNING) */ 8843f82d70SJoerg Sonnenberger 8943f82d70SJoerg Sonnenberger unsigned char *_up; /* saved _p when _p is doing ungetc data */ 90*e0f95098SPeter Avalos pthread_mutex_t _fl_mutex; /* used for MT-safety */ 91*e0f95098SPeter Avalos pthread_t _fl_owner; /* current owner */ 92*e0f95098SPeter Avalos int _fl_count; /* recursive lock count */ 936f1e2b38SJoerg Sonnenberger 946f1e2b38SJoerg Sonnenberger struct wchar_io_data _wcio; 9555b5af84SJoerg Sonnenberger }; 9655b5af84SJoerg Sonnenberger 9755b5af84SJoerg Sonnenberger /* 9855b5af84SJoerg Sonnenberger * I/O descriptors for __sfvwrite(). 9955b5af84SJoerg Sonnenberger */ 10055b5af84SJoerg Sonnenberger struct __siov { 10155b5af84SJoerg Sonnenberger void *iov_base; 10255b5af84SJoerg Sonnenberger size_t iov_len; 10355b5af84SJoerg Sonnenberger }; 10455b5af84SJoerg Sonnenberger struct __suio { 10555b5af84SJoerg Sonnenberger struct __siov *uio_iov; 10655b5af84SJoerg Sonnenberger int uio_iovcnt; 10755b5af84SJoerg Sonnenberger int uio_resid; 10855b5af84SJoerg Sonnenberger }; 10955b5af84SJoerg Sonnenberger 11055b5af84SJoerg Sonnenberger /* 11155b5af84SJoerg Sonnenberger * The first few FILEs are statically allocated; others are dynamically 11255b5af84SJoerg Sonnenberger * allocated and linked in via this glue structure. 11355b5af84SJoerg Sonnenberger */ 11455b5af84SJoerg Sonnenberger struct glue { 11555b5af84SJoerg Sonnenberger struct glue *next; 11655b5af84SJoerg Sonnenberger int niobs; 11755b5af84SJoerg Sonnenberger FILE *iobs; 11855b5af84SJoerg Sonnenberger }; 11955b5af84SJoerg Sonnenberger 12055b5af84SJoerg Sonnenberger extern struct glue __sglue; 12155b5af84SJoerg Sonnenberger 12255b5af84SJoerg Sonnenberger __BEGIN_DECLS 12355b5af84SJoerg Sonnenberger int __sfvwrite(FILE *, struct __suio *); 12455b5af84SJoerg Sonnenberger __END_DECLS 12555b5af84SJoerg Sonnenberger 12655b5af84SJoerg Sonnenberger #endif /* _LIBC_PRIV_STDIO_H_ */ 127