fdstream.cc

Go to the documentation of this file.
00001 #include "config.h"
00002 
00003 #include <unistd.h>
00004 
00005 #include "error.h"
00006 #include "fdstream.h"
00007 
00008 //-----------------------------------------------------------------------------
00009 
00010 fdoutbuf::fdoutbuf()
00011 {
00012 }
00013 
00014 fdoutbuf::fdoutbuf(int a_fd)
00015 {
00016         attach(a_fd);
00017 }
00018 
00019 void fdoutbuf::attach(int a_fd)
00020 {
00021         m_fd = a_fd;
00022 }
00023 
00024 int fdoutbuf::overflow(int a_c)
00025 {
00026         if (a_c != EOF) {
00027                 char z = a_c;
00028                 if (::write(m_fd, &z, 1) != 1)
00029                         return(EOF);
00030         }
00031         return(a_c);
00032 }
00033 
00034 std::streamsize fdoutbuf::xsputn(const char* a_s, std::streamsize a_num)
00035 {
00036         return(::write(m_fd, a_s, a_num));
00037 }
00038 
00039 //-----------------------------------------------------------------------------
00040 
00041 ofdstream::ofdstream() : std::ostream(&m_buf)
00042 {
00043 }
00044 
00045 ofdstream::ofdstream(int a_fd) : std::ostream(&m_buf)
00046 {
00047         m_fd = a_fd;
00048         m_buf.attach(a_fd);
00049 }
00050 
00051 void ofdstream::attach(int a_fd)
00052 {
00053         m_fd = a_fd;
00054         m_buf.attach(a_fd);
00055 }
00056 
00057 int ofdstream::fd(void)
00058 {
00059         return(m_fd);
00060 }
00061 
00062 //-----------------------------------------------------------------------------
00063 
00064 fdinbuf::fdinbuf()
00065 {
00066         setg(m_buffer+4, m_buffer+4, m_buffer+4);
00067 }
00068 
00069 fdinbuf::fdinbuf(int a_fd)
00070 {
00071         m_fd = a_fd;
00072         setg(m_buffer+4, m_buffer+4, m_buffer+4);
00073 }
00074 
00075 void fdinbuf::attach(int a_fd)
00076 {
00077         m_fd = a_fd;
00078 }
00079 
00080 int fdinbuf::underflow(void)
00081 {
00082         int num_put_back;
00083         int num;
00084 
00085         if (gptr() < egptr()) {
00086                 return(*gptr());
00087         }
00088 
00089         num_put_back = gptr() - eback();
00090         if (num_put_back > 0)
00091                 num_put_back = 4;
00092         
00093         std::memcpy(m_buffer+(4-num_put_back), gptr()-num_put_back, num_put_back);
00094 
00095         num = ::read(m_fd, m_buffer+4, m_buffer_size-4);
00096         if (num <= 0)
00097                 return(EOF);
00098         
00099         setg(m_buffer+(4-num_put_back), m_buffer+4, m_buffer+4+num);
00100 
00101         return(*gptr());
00102 }
00103 
00104 //-----------------------------------------------------------------------------
00105 
00106 ifdstream::ifdstream() : std::istream(&m_buf)
00107 {
00108 }
00109 
00110 ifdstream::ifdstream(int a_fd) : std::istream(&m_buf)
00111 {
00112         m_fd = a_fd;
00113         m_buf.attach(a_fd);
00114 }
00115 
00116 void ifdstream::attach(int a_fd)
00117 {
00118         m_fd = a_fd;
00119         m_buf.attach(a_fd);
00120 }
00121 
00122 int ifdstream::fd(void)
00123 {
00124         return(m_fd);
00125 }
00126 
00127 //-----------------------------------------------------------------------------
00128 

Generated on Thu Jun 5 11:12:56 2008 for rvm by  doxygen 1.5.1