Skip to content
Snippets Groups Projects
Commit b682dc0c authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Start work on XDR Stream output

parent af0e76de
No related branches found
No related tags found
No related merge requests found
#ifndef XDRSTREAM_H
#define XDRSTREAM_H
#include <stdint.h>
class XDRStream {
private:
XDRStream(const XDRStream& copy);
uint32_t next_array_len;
public:
XDRStream() : next_array_len(0) {}
void setNextArrayLen(uint32_t len) {next_array_len = len;}
virtual void put(char c) = 0;
virtual void flush() {}
XDRStream & operator<<(char c);
XDRStream & operator<<(unsigned char c);
XDRStream & operator<<(unsigned short number);
XDRStream & operator<<(short number);
XDRStream & operator<<(unsigned int number);
XDRStream & operator<<(int number);
XDRStream & operator<<(unsigned long number);
XDRStream & operator<<(long number);
XDRStream & operator<<(unsigned long long number);
XDRStream & operator<<(long long number);
XDRStream & operator<<(const char *text);
XDRStream & operator<<(XDRStream & (*fun) (XDRStream &));
};
// FLUSH: flush XDRStream buffer
XDRStream & flush(XDRStream & os);
// TERM: zero-termination
XDRStream & term(XDRStream & os);
XDRStream & opaque(XDRStream & os);
#endif //OUTPUTSTREAM_H
#include "object/xdrstream.h"
XDRStream & XDRStream::operator<<(unsigned char c)
{
*this << (uint32_t)c;
return *this;
}
XDRStream & XDRStream::operator<<(char c)
{
*this << (int32_t)c;
return *this;
}
XDRStream & XDRStream::operator<<(uint16_t number)
{
*this << (uint32_t)number;
return *this;
}
XDRStream & XDRStream::operator<<(int16_t number)
{
*this << (int32_t)number;
return *this;
}
XDRStream & XDRStream::operator<<(uint32_t number)
{
put((number >> 24) & 0xffU);
put((number >> 16) & 0xffU);
put((number >> 8) & 0xffU);
put(number & 0xffU);
return *this;
}
XDRStream & XDRStream::operator<<(int32_t number)
{
put((number >> 24) & 0xffU);
put((number >> 16) & 0xffU);
put((number >> 8) & 0xffU);
put(number & 0xffU);
return *this;
}
XDRStream & XDRStream::operator<<(uint64_t number)
{
put((number >> 56) & 0xffU);
put((number >> 48) & 0xffU);
put((number >> 40) & 0xffU);
put((number >> 32) & 0xffU);
put((number >> 24) & 0xffU);
put((number >> 16) & 0xffU);
put((number >> 8) & 0xffU);
put(number & 0xffU);
return *this;
}
XDRStream & XDRStream::operator<<(int64_t number)
{
put((number >> 56) & 0xffU);
put((number >> 48) & 0xffU);
put((number >> 40) & 0xffU);
put((number >> 32) & 0xffU);
put((number >> 24) & 0xffU);
put((number >> 16) & 0xffU);
put((number >> 8) & 0xffU);
put(number & 0xffU);
return *this;
}
XDRStream & XDRStream::operator<<(char const *data){
uint32_t i;
for (i = 0; i < next_array_len; i++) {
put(data[i]);
}
while ((i++) % 4 != 0){
put('\0');
}
return *this;
}
XDRStream & XDRStream::operator<<(XDRStream & (*fkt) (XDRStream &))
{
return fkt(*this);
}
// FLUSH
XDRStream & flush(XDRStream & os)
{
os.flush();
return os;
}
// TERM: null-termination
XDRStream & term(XDRStream & os)
{
os.put('\0');
os.flush();
return os;
}
XDRStream & opaque(XDRStream & os)
{
os.setNextArrayLen(3);
return os;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment