sustaining_gazes/lib/3rdParty/dlib/include/dlib/sockstreambuf/sockstreambuf_unbuffered.cpp
2016-04-28 15:40:36 -04:00

168 lines
4.1 KiB
C++

// Copyright (C) 2003 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_SOCKSTrEAMBUF_UNBUFFERED_CPp_
#define DLIB_SOCKSTrEAMBUF_UNBUFFERED_CPp_
#include "sockstreambuf_unbuffered.h"
namespace dlib
{
// ----------------------------------------------------------------------------------------
// output functions
// ----------------------------------------------------------------------------------------
sockstreambuf_unbuffered::int_type sockstreambuf_unbuffered::
overflow (
int_type c
)
{
if (c != EOF)
{
char temp = static_cast<char>(c);
if (con.write(&temp,1) != 1)
{
// if the write was not successful
return EOF;
}
}
return c;
}
// ----------------------------------------------------------------------------------------
std::streamsize sockstreambuf_unbuffered::
xsputn (
const char* s,
std::streamsize num
)
{
if (con.write(s,static_cast<int>(num)) != num)
{
// the write was not successful so return that 0 bytes were written
return 0;
}
return num;
}
// ----------------------------------------------------------------------------------------
// input functions
// ----------------------------------------------------------------------------------------
sockstreambuf_unbuffered::int_type sockstreambuf_unbuffered::
underflow(
)
{
if (lastread_next)
{
return lastread;
}
else if (peek != EOF)
{
return peek;
}
else
{
char temp;
if (con.read(&temp,1) != 1)
{
// some error occurred
return EOF;
}
peek = static_cast<unsigned char>(temp);
return peek;
}
}
// ----------------------------------------------------------------------------------------
sockstreambuf_unbuffered::int_type sockstreambuf_unbuffered::
uflow(
)
{
if (lastread_next)
{
lastread_next = false;
return lastread;
}
else if (peek != EOF)
{
lastread = peek;
peek = EOF;
return lastread;
}
else
{
char temp;
if (con.read(&temp,1) != 1)
{
// some error occurred
return EOF;
}
lastread = static_cast<unsigned char>(temp);
return lastread;
}
}
// ----------------------------------------------------------------------------------------
sockstreambuf_unbuffered::int_type sockstreambuf_unbuffered::
pbackfail(
int_type c
)
{
// if they are trying to push back a character that they didn't read last
// that is an error
if (c != EOF && c != lastread)
return EOF;
// if they are trying to push back a second character then thats an error
if (lastread_next)
return EOF;
lastread_next = true;
return 1;
}
// ----------------------------------------------------------------------------------------
std::streamsize sockstreambuf_unbuffered::
xsgetn (
char_type* s,
std::streamsize n
)
{
std::streamsize temp = n;
if (lastread_next && n > 0)
{
*s = lastread;
lastread_next = false;
++s;
--n;
}
if (peek != EOF && n > 0)
{
*s = peek;
peek = EOF;
++s;
--n;
}
while (n>0)
{
int status = con.read(s,static_cast<int>(n));
if (status < 1)
break;
n -= status;
s += status;
}
return temp-n;
}
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_SOCKSTrEAMBUF_UNBUFFERED_CPp_