diff --git a/headers/posix/libio.h b/headers/posix/libio.h new file mode 100644 index 0000000000..e24f8f862f --- /dev/null +++ b/headers/posix/libio.h @@ -0,0 +1,258 @@ +/* Copyright (C) 1991,92,93,94,95,97,98,99,2000,2001 Free Software Foundation, Inc. + This file is part of the GNU IO Library. + Written by Per Bothner . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + As a special exception, if you link this library with files + compiled with a GNU compiler to produce an executable, this does + not cause the resulting executable to be covered by the GNU General + Public License. This exception does not however invalidate any + other reasons why the executable file might be covered by the GNU + General Public License. +*/ +#ifndef _IO_STDIO_H_ +#define _IO_STDIO_H_ + +#include +#include + +#ifndef EOF +# define EOF -1 +#endif + +#define _IO_pos_t off_t /* obsolete */ +#define _IO_fpos_t off_t +#define _IO_fpos64_t off_t +#define _IO_size_t size_t +#define _IO_ssize_t ssize_t +#define _IO_off_t off_t +#define _IO_off64_t off_t +#define _IO_pid_t pid_t +#define _IO_uid_t uid_t +#define _IO_HAVE_SYS_WAIT _G_HAVE_SYS_WAIT +#define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE +#define _IO_BUFSIZ BUFSIZ +#define _IO_va_list va_list + +#define _IOS_INPUT 1 +#define _IOS_OUTPUT 2 +#define _IOS_ATEND 4 +#define _IOS_APPEND 8 +#define _IOS_TRUNC 16 +#define _IOS_NOCREATE 32 +#define _IOS_NOREPLACE 64 +#define _IOS_BIN 128 + +/* Magic numbers and bits for the _flags field. + The magic numbers use the high-order bits of _flags; + the remaining bits are available for variable flags. + Note: The magic numbers must all be negative if stdio + emulation is desired. */ + +#define _IO_MAGIC 0xFBAD0000 /* Magic number */ +#define _OLD_STDIO_MAGIC 0xFABC0000 /* Emulate old stdio. */ +#define _IO_MAGIC_MASK 0xFFFF0000 +#define _IO_USER_BUF 1 /* User owns buffer; don't delete it on close. */ +#define _IO_UNBUFFERED 2 +#define _IO_NO_READS 4 /* Reading not allowed */ +#define _IO_NO_WRITES 8 /* Writing not allowd */ +#define _IO_EOF_SEEN 0x10 +#define _IO_ERR_SEEN 0x20 +#define _IO_DELETE_DONT_CLOSE 0x40 /* Don't call close(_fileno) on cleanup. */ +#define _IO_LINKED 0x80 /* Set if linked (using _chain) to streambuf::_list_all.*/ +#define _IO_IN_BACKUP 0x100 +#define _IO_LINE_BUF 0x200 +#define _IO_TIED_PUT_GET 0x400 /* Set if put and get pointer logicly tied. */ +#define _IO_CURRENTLY_PUTTING 0x800 +#define _IO_IS_APPENDING 0x1000 +#define _IO_IS_FILEBUF 0x2000 +#define _IO_BAD_SEEN 0x4000 + +/* These are "formatting flags" matching the iostream fmtflags enum values. */ +#define _IO_SKIPWS 01 +#define _IO_LEFT 02 +#define _IO_RIGHT 04 +#define _IO_INTERNAL 010 +#define _IO_DEC 020 +#define _IO_OCT 040 +#define _IO_HEX 0100 +#define _IO_SHOWBASE 0200 +#define _IO_SHOWPOINT 0400 +#define _IO_UPPERCASE 01000 +#define _IO_SHOWPOS 02000 +#define _IO_SCIENTIFIC 04000 +#define _IO_FIXED 010000 +#define _IO_UNITBUF 020000 +#define _IO_STDIO 040000 +#define _IO_DONT_CLOSE 0100000 +#define _IO_BOOLALPHA 0200000 + + +struct _IO_marker; +struct _IO_codecvt; +struct _IO_wide_data; +typedef void _IO_lock_t; + + +struct _IO_marker { + struct _IO_marker *_next; + struct _IO_FILE *_sbuf; + int _pos; +}; + +typedef struct _IO_FILE { + int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ +# define _IO_file_flags _flags + + /* The following pointers correspond to the C++ streambuf protocol. */ + /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ + char *_IO_read_ptr; /* Current read pointer */ + char *_IO_read_end; /* End of get area. */ + char *_IO_read_base; /* Start of putback+get area. */ + char *_IO_write_base; /* Start of put area. */ + char *_IO_write_ptr; /* Current put pointer. */ + char *_IO_write_end; /* End of put area. */ + char *_IO_buf_base; /* Start of reserve area. */ + char *_IO_buf_end; /* End of reserve area. */ + /* The following fields are used to support backing up and undo. */ + char *_IO_save_base; /* Pointer to start of non-current get area. */ + char *_IO_backup_base; /* Pointer to first valid character of backup area */ + char *_IO_save_end; /* Pointer to end of non-current get area. */ + + struct _IO_marker *_markers; + + struct _IO_FILE *_chain; + + int _fileno; +// int _blksize; + int _flags2; + off_t _old_offset; /* This used to be _offset but it's too small. */ + /* -> not true on BeOS, but who cares */ + + /* 1+column number of pbase(); 0 is unknown. */ + unsigned short _cur_column; + signed char _vtable_offset; + char _shortbuf[1]; + + _IO_lock_t *_lock; + + off_t _offset; +//#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T + /* Wide character stream stuff. */ + struct _IO_codecvt *_codecvt; + struct _IO_wide_data *_wide_data; +//#else +// void *__pad1; +// void *__pad2; +//#endif + int _mode; + /* Make sure we don't get into trouble again. */ + char _unused2[15 * sizeof (int) - 2 * sizeof (void *)]; +} _IO_FILE; + + +#ifdef __cplusplus +extern "C" { +#endif + +extern int _IO_feof(_IO_FILE *stream); +extern int _IO_feof_unlocked(_IO_FILE *stream); +extern int _IO_ferror(_IO_FILE *stream); +extern int _IO_ferror_unlocked(_IO_FILE *stream); +extern int _IO_putc(int c, _IO_FILE *stream); +extern int _IO_putc_unlocked(int c, _IO_FILE *stream); +extern int _IO_getc(_IO_FILE *stream); +extern int _IO_getc_unlocked(_IO_FILE *stream); +extern int _IO_peekc_unlocked(_IO_FILE *stream); + +extern int __underflow(_IO_FILE *stream); +extern int __uflow(_IO_FILE *stream); +extern int __overflow(_IO_FILE *stream, int c); + +extern int _IO_peekc_locked(_IO_FILE *stream); + +/* This one is for Emacs. */ +#define _IO_PENDING_OUTPUT_COUNT(_fp) \ + ((_fp)->_IO_write_ptr - (_fp)->_IO_write_base) + +extern void _IO_flockfile(_IO_FILE *); +extern void _IO_funlockfile(_IO_FILE *); +extern int _IO_ftrylockfile(_IO_FILE *); + +#ifdef _IO_MTSAFE_IO +# define _IO_peekc(_fp) _IO_peekc_locked (_fp) +#else +# define _IO_peekc(_fp) _IO_peekc_unlocked (_fp) +# define _IO_flockfile(_fp) /**/ +# define _IO_funlockfile(_fp) /**/ +# define _IO_ftrylockfile(_fp) /**/ +# define _IO_cleanup_region_start(_fct, _fp) /**/ +# define _IO_cleanup_region_end(_Doit) /**/ +#endif /* !_IO_MTSAFE_IO */ + +extern int _IO_vfscanf(_IO_FILE *, const char *, va_list, int *); +extern int _IO_vfprintf(_IO_FILE *, const char *, va_list); +extern _IO_ssize_t _IO_padn(_IO_FILE *, int, _IO_ssize_t); +extern _IO_size_t _IO_sgetn(_IO_FILE *, void *, _IO_size_t); + +extern _IO_fpos64_t _IO_seekoff(_IO_FILE *, _IO_off64_t, int, int); +extern _IO_fpos64_t _IO_seekpos(_IO_FILE *, _IO_fpos64_t, int); + +extern void _IO_free_backup_area(_IO_FILE *); + +#ifdef __cplusplus +# define __INLINE inline +#else +# define __INLINE extern __inline +#endif + +__INLINE int +_IO_getc_unlocked(_IO_FILE *stream) +{ + if (stream->_IO_read_ptr >= stream->_IO_read_end) + return __uflow(stream); + + return *(unsigned char *)stream->_IO_read_ptr++; +} + + +__INLINE int +_IO_peekc_unlocked(_IO_FILE *stream) +{ + if (stream->_IO_read_ptr >= stream->_IO_read_end && __underflow(stream) == EOF) + return EOF; + + return *(unsigned char *)stream->_IO_read_ptr; +} + + +__INLINE int +_IO_putc_unlocked(int c, _IO_FILE *stream) +{ + if (stream->_IO_write_ptr >= stream->_IO_write_end) + return __overflow(stream, (unsigned char)c); + + return (unsigned char)(*stream->_IO_write_ptr++ = c); +} + +#undef __INLINE + +#ifdef __cplusplus +} +#endif + +#endif /* _IO_STDIO_H_ */ diff --git a/headers/posix/stdio_post.h b/headers/posix/stdio_post.h index 68972fedfa..9bcd878f86 100644 --- a/headers/posix/stdio_post.h +++ b/headers/posix/stdio_post.h @@ -1,9 +1,8 @@ -#ifndef _STDIO_POST_H_ -#define _STDIO_POST_H_ /* ** Distributed under the terms of the OpenBeOS License. */ - +#ifndef _STDIO_POST_H_ +#define _STDIO_POST_H_ // "Private"/inline functions of our BeOS compatible stdio implementation @@ -16,6 +15,11 @@ # error "This file must be included from stdio.h!" #endif +extern char _single_threaded; + // this boolean value is true (1) if there is only the main thread + // running - as soon as you spawn the first thread, it's set to + // false (0) + #ifdef __cplusplus # define __INLINE inline #else @@ -23,25 +27,13 @@ #endif -extern int _IO_feof_unlocked(FILE *stream); -extern int _IO_ferror_unlocked(FILE *stream); -extern int _IO_putc(int c, FILE *stream); -extern int _IO_putc_unlocked(int c, FILE *stream); -extern int _IO_getc(FILE *stream); -extern int _IO_getc_unlocked(FILE *stream); -extern int _IO_peekc_unlocked(FILE *stream); - -extern int __underflow(FILE *stream); -extern int __uflow(FILE *stream); -extern int __overflow(FILE *stream, int c); - - __INLINE int feof_unlocked(FILE *stream) { return _IO_feof_unlocked(stream); } + __INLINE int ferror_unlocked(FILE *stream) { @@ -54,35 +46,6 @@ ferror_unlocked(FILE *stream) #define putc(c, stream) \ (_single_threaded ? _IO_putc_unlocked(c, stream) : _IO_putc(c, stream)) -__INLINE int -_IO_getc_unlocked(FILE *stream) -{ - if (stream->_IO_read_ptr >= stream->_IO_read_end) - return __uflow(stream); - - return *(unsigned char *)stream->_IO_read_ptr++; -} - - -__INLINE int -_IO_peekc_unlocked(FILE *stream) -{ - if (stream->_IO_read_ptr >= stream->_IO_read_end && __underflow(stream) == EOF) - return EOF; - - return *(unsigned char *)stream->_IO_read_ptr; -} - - -__INLINE int -_IO_putc_unlocked(int c, FILE *stream) -{ - if (stream->_IO_write_ptr >= stream->_IO_write_end) - return __overflow(stream, (unsigned char)c); - - return (unsigned char)(*stream->_IO_write_ptr++ = c); -} - __INLINE int putc_unlocked(int c, FILE *stream) @@ -97,6 +60,20 @@ putchar_unlocked(int c) return _IO_putc_unlocked(c, stdout); } + +__INLINE int +getc_unlocked(FILE *stream) +{ + return _IO_getc_unlocked(stream); +} + + +__INLINE int +getchar_unlocked(void) +{ + return _IO_getc_unlocked(stdin); +} + #undef __INLINE #endif /* _STDIO_POST_H_ */ diff --git a/headers/posix/stdio_pre.h b/headers/posix/stdio_pre.h index d1ef3ce213..e15e96ad79 100644 --- a/headers/posix/stdio_pre.h +++ b/headers/posix/stdio_pre.h @@ -1,117 +1,16 @@ -#ifndef _STDIO_PRE_H_ -#define _STDIO_PRE_H_ /* ** Distributed under the terms of the OpenBeOS License. */ - - -// Details of the BeOS compatible stdio implementation -// Structure definitions - -// ToDo: this is a work in progress to make our stdio -// BeOS' GNU/libio (almost) binary compatible -// We are not yet compatible! -// Currently only function names are compatible +#ifndef _STDIO_PRE_H_ +#define _STDIO_PRE_H_ #ifndef _STDIO_H_ # error "This file must be included from stdio.h!" #endif +#include -extern char *_single_threaded; - /* This determines if a process runs single threaded or not */ - - -/* stdio buffers */ -struct __sbuf { - unsigned char *_base; - int _size; -}; - -/* - * stdio state variables. - * - * The following always hold: - * - *if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), - * _lbfsize is -_bf._size, else _lbfsize is 0 - *if _flags&__SRD, _w is 0 - *if _flags&__SWR, _r is 0 - * - * This ensures that the getc and putc macros (or inline functions) never - * try to write or read from a file that is in `read' or `write' mode. - * (Moreover, they can, and do, automatically switch from read mode to - * write mode, and back, on "r+" and "w+" files.) - * - * _lbfsize is used only to make the inline line-buffered output stream - * code as compact as possible. - * - * _ub, _up, and _ur are used when ungetc() pushes back more characters - * than fit in the current _bf, or when ungetc() pushes back a character - * that does not match the previous one in _bf. When this happens, - * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff - * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. - */ -typedef struct __FILE { - // ToDo: these fields must be maintained (at the same position)! - //int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ - char *_IO_read_ptr; /* Current read pointer */ - char *_IO_read_end; /* End of get area. */ - //char *_IO_read_base; /* Start of putback+get area. */ - //char *_IO_write_base; /* Start of put area. */ - char *_IO_write_ptr; /* Current put pointer. */ - char *_IO_write_end; /* End of put area. */ - - unsigned char *_p;/* current position in (some) buffer */ - int _r; /* read space left for getc() */ - int _w; /* write space left for putc() */ - short _flags; /* flags, below; this FILE is free if 0 */ - short _file; /* fileno, if Unix descriptor, else -1 */ - struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ - int _lbfsize;/* 0 or -_bf._size, for inline putc */ - - /* operations */ - void *_cookie;/* cookie passed to io functions */ - int (*_close) (void *); - int (*_read) (void *, char *, int); - fpos_t (*_seek) (void *, fpos_t, int); - int (*_write) (void *, const char *, int); - - /* separate buffer for long sequences of ungetc() */ - struct __sbuf _ub; /* ungetc buffer */ - unsigned char *_up; /* saved _p when _p is doing ungetc data */ - int _ur;/* saved _r when _r is counting ungetc data */ - - /* tricks to meet minimum requirements even when malloc() fails */ - unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ - unsigned char _nbuf[1]; /* guarantee a getc() buffer */ - - /* separate buffer for fgetln() when line crosses buffer boundary */ - struct __sbuf _lb; /* buffer for fgetln() */ - - /* Unix stdio files get aligned to block boundaries on fseek() */ - int _blksize;/* stat.st_blksize (may be != _bf._size) */ - fpos_t _offset;/* current lseek offset */ - - // ToDo: add structure reserved fields -} FILE; - -#define __SLBF 0x0001 /* line buffered */ -#define __SNBF 0x0002 /* unbuffered */ -#define __SRD 0x0004 /* OK to read */ -#define __SWR 0x0008 /* OK to write */ - /* RD and WR are never simultaneously asserted */ -#define __SRW 0x0010 /* open for reading & writing */ -#define __SEOF 0x0020 /* found EOF */ -#define __SERR 0x0040 /* found error */ -#define __SMBF 0x0080 /* _buf is from malloc */ -#define __SAPP 0x0100 /* fdopen()ed in append mode */ -#define __SSTR 0x0200 /* this is an sprintf/snprintf string */ -#define __SOPT 0x0400 /* do fseek() optimisation */ -#define __SNPT 0x0800 /* do not do fseek() optimisation */ -#define __SOFF 0x1000 /* set iff _offset is in fact correct */ -#define __SMOD 0x2000 /* true => fgetln modified _p text */ -#define __SALC 0x4000 /* allocate string space dynamically */ +typedef struct _IO_FILE FILE; #define __PRINTFLIKE(format, varargs) __attribute__ ((__format__ (__printf__, format, varargs))); #define __SCANFLIKE(format, varargs) __attribute__((__format__ (__scanf__, format, varargs)))