Annotation of GNUtools/libg++/libio/filebuf.cc, revision 1.1.1.1

1.1       root        1: /* This is part of libio/iostream, providing -*- C++ -*- input/output.
                      2: Copyright (C) 1993 Free Software Foundation
                      3: 
                      4: This file is part of the GNU IO Library.  This library is free
                      5: software; you can redistribute it and/or modify it under the
                      6: terms of the GNU General Public License as published by the
                      7: Free Software Foundation; either version 2, or (at your option)
                      8: any later version.
                      9: 
                     10: This library is distributed in the hope that it will be useful,
                     11: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     13: GNU General Public License for more details.
                     14: 
                     15: You should have received a copy of the GNU General Public License
                     16: along with GNU CC; see the file COPYING.  If not, write to
                     17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     18: 
                     19: As a special exception, if you link this library with files
                     20: compiled with a GNU compiler to produce an executable, this does not cause
                     21: the resulting executable to be covered by the GNU General Public License.
                     22: This exception does not however invalidate any other reasons why
                     23: the executable file might be covered by the GNU General Public License.
                     24: 
                     25: Written by Per Bothner ([email protected]). */
                     26: 
                     27: #include "iostreamP.h"
                     28: #include <sys/types.h>
                     29: #include <sys/stat.h>
                     30: #include <fcntl.h>
                     31: #include <errno.h>
                     32: #include "builtinbuf.h"
                     33: 
                     34: #define CLOSED_FILEBUF_FLAGS \
                     35:   (_IO_IS_FILEBUF+_IO_NO_READS+_IO_NO_WRITES+_IO_TIED_PUT_GET)
                     36: 
                     37: void filebuf::init()
                     38: {
                     39:   _IO_file_init(this);
                     40: }
                     41: 
                     42: filebuf::filebuf() : streambuf(CLOSED_FILEBUF_FLAGS)
                     43: {
                     44:   _IO_file_init(this);
                     45: }
                     46: 
                     47: /* This is like "new filebuf()", but it uses the _IO_file_jump jumptable,
                     48:    for eficiency. */
                     49: 
                     50: filebuf* filebuf::__new()
                     51: {
                     52:   filebuf *fb = new filebuf;
                     53:   fb->_jumps = &_IO_file_jumps;
                     54:   fb->_vtable() = NULL;
                     55:   return fb;
                     56: }
                     57: 
                     58: filebuf::filebuf(int fd) : streambuf(CLOSED_FILEBUF_FLAGS)
                     59: {
                     60:   _IO_file_init(this);
                     61:   _IO_file_attach(this, fd);
                     62: }
                     63: 
                     64: filebuf::filebuf(int fd, char* p, int len) : streambuf(CLOSED_FILEBUF_FLAGS)
                     65: {
                     66:   _IO_file_init(this);
                     67:   _IO_file_attach(this, fd);
                     68:   setbuf(p, len);
                     69: }
                     70: 
                     71: filebuf::~filebuf()
                     72: {
                     73:     if (!(xflags() & _IO_DELETE_DONT_CLOSE))
                     74:        close();
                     75: 
                     76:     _un_link();
                     77: }
                     78: 
                     79: filebuf* filebuf::open(const char *filename, ios::openmode mode, int prot)
                     80: {
                     81:   if (_IO_file_is_open (this))
                     82:     return NULL;
                     83:   int posix_mode;
                     84:   int read_write;
                     85:   if (mode & ios::app)
                     86:     mode |= ios::out;
                     87:   if ((mode & (ios::in|ios::out)) == (ios::in|ios::out)) {
                     88:     posix_mode = O_RDWR;
                     89:     read_write = 0;
                     90:   }
                     91:   else if (mode & ios::out)
                     92:     posix_mode = O_WRONLY, read_write = _IO_NO_READS;
                     93:   else if (mode & (int)ios::in)
                     94:     posix_mode = O_RDONLY, read_write = _IO_NO_WRITES;
                     95:   else
                     96:     posix_mode = 0, read_write = _IO_NO_READS+_IO_NO_WRITES;
                     97:   if ((mode & (int)ios::trunc) || mode == (int)ios::out)
                     98:     posix_mode |= O_TRUNC;
                     99:   if (mode & ios::app)
                    100:     posix_mode |= O_APPEND, read_write |= _IO_IS_APPENDING;
                    101:   if (!(mode & (int)ios::nocreate) && mode != ios::in)
                    102:     posix_mode |= O_CREAT;
                    103:   if (mode & (int)ios::noreplace)
                    104:     posix_mode |= O_EXCL;
                    105:   int fd = ::open(filename, posix_mode, prot);
                    106:   if (fd < 0)
                    107:     return NULL;
                    108:   _fileno = fd;
                    109:   xsetflags(read_write, _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
                    110:   if (mode & (ios::ate|ios::app)) {
                    111:     if (sseekoff(0, ios::end) == EOF)
                    112:       return NULL;
                    113:   }
                    114:   _IO_link_in(this);
                    115:   return this;
                    116: }
                    117: 
                    118: filebuf* filebuf::open(const char *filename, const char *mode)
                    119: {
                    120:   return (filebuf*)_IO_file_fopen(this, filename, mode);
                    121: }
                    122: 
                    123: filebuf* filebuf::attach(int fd)
                    124: {
                    125:   return (filebuf*)_IO_file_attach(this, fd);
                    126: }
                    127: 
                    128: streambuf* filebuf::setbuf(char* p, int len)
                    129: {
                    130:   return (streambuf*)_IO_file_setbuf(this, p, len);
                    131: }
                    132: 
                    133: int filebuf::doallocate() { return _IO_file_doallocate(this); }
                    134: 
                    135: int filebuf::overflow(int c)
                    136: {
                    137:   return _IO_file_overflow(this, c);
                    138: }
                    139: 
                    140: int filebuf::underflow()
                    141: {
                    142:   return _IO_file_underflow(this);
                    143: }
                    144: 
                    145: int filebuf::do_write(const char *data, int to_do)
                    146: {
                    147:   return _IO_do_write(this, data, to_do);
                    148: }
                    149: 
                    150: int filebuf::sync()
                    151: {
                    152:   return _IO_file_sync(this);
                    153: }
                    154: 
                    155: streampos filebuf::seekoff(streamoff offset, _seek_dir dir, int mode)
                    156: {
                    157:   return _IO_file_seekoff (this, offset, convert_to_seekflags(dir, mode));
                    158: }
                    159: 
                    160: filebuf* filebuf::close()
                    161: {
                    162:   return (_IO_file_close_it(this) ? NULL : this);
                    163: }
                    164: 
                    165: streamsize filebuf::sys_read(char* buf, streamsize size)
                    166: {
                    167:   return _IO_file_read(this, buf, size);
                    168: }
                    169: 
                    170: streampos filebuf::sys_seek(streamoff offset, _seek_dir dir)
                    171: {
                    172:   return _IO_file_seek(this, offset, dir);
                    173: }
                    174: 
                    175: streamsize filebuf::sys_write(const char *buf, streamsize n)
                    176: {
                    177:   return _IO_file_write (this, buf, n);
                    178: }
                    179: 
                    180: int filebuf::sys_stat(void* st)
                    181: {
                    182:   return _IO_file_stat (this, st);
                    183: }
                    184: 
                    185: int filebuf::sys_close()
                    186: {
                    187:   return _IO_file_close (this);
                    188: }
                    189: 
                    190: streamsize filebuf::xsputn(const char *s, streamsize n)
                    191: {
                    192:   return _IO_file_xsputn(this, s, n);
                    193: }
                    194: 
                    195: streamsize filebuf::xsgetn(char *s, streamsize n)
                    196: {
                    197:     // FIXME: OPTIMIZE THIS (specifically, when unbuffered()).
                    198:     return streambuf::xsgetn(s, n);
                    199: }
                    200: 
                    201: // Non-ANSI AT&T-ism:  Default open protection.
                    202: const int filebuf::openprot = 0644;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.