2 * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
4 * ShapeFusion is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * ShapeFusion is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with ShapeFusion; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include "BigEndianBuffer.h"
22 BigEndianBuffer::BigEndianBuffer(unsigned int _size):
23 GenericEndianBuffer(_size)
28 BigEndianBuffer::BigEndianBuffer(unsigned char *_data, unsigned int _size):
29 GenericEndianBuffer(_data, _size)
34 BigEndianBuffer::~BigEndianBuffer(void)
39 short BigEndianBuffer::ReadShort(void)
41 if ((unsigned int)(mPosition - mData + 1) < mSize) {
42 unsigned char hi = *mPosition++,
45 return (short)((hi << 8) | lo);
47 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
52 unsigned short BigEndianBuffer::ReadUShort(void)
54 if ((unsigned int)(mPosition - mData + 1) < mSize) {
55 unsigned char hi = *mPosition++,
58 return (unsigned short)((hi << 8) | lo);
60 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
65 long BigEndianBuffer::ReadLong(void)
67 if ((unsigned int)(mPosition - mData + 3) < mSize) {
68 unsigned char a = *mPosition++,
73 return (long)((a << 24) | (b << 16) | (c << 8) | d);
75 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
80 unsigned long BigEndianBuffer::ReadULong(void)
82 if ((unsigned int)(mPosition - mData + 3) < mSize) {
83 unsigned char a = *mPosition++,
88 return (unsigned long)((a << 24) | (b << 16) | (c << 8) | d);
90 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
95 void BigEndianBuffer::WriteShort(short v)
97 if ((unsigned int)(mPosition - mData + 1) < mSize) {
98 *mPosition++ = (v >> 8) & 0xff;
99 *mPosition++ = v & 0xff;
101 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
105 void BigEndianBuffer::WriteUShort(unsigned short v)
107 if ((unsigned int)(mPosition - mData + 1) < mSize) {
108 *mPosition++ = (v >> 8) & 0xff;
109 *mPosition++ = v & 0xff;
111 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
115 void BigEndianBuffer::WriteLong(long v)
117 if ((unsigned int)(mPosition - mData + 3) < mSize) {
118 *mPosition++ = (v >> 24) & 0xff;
119 *mPosition++ = (v >> 16) & 0xff;
120 *mPosition++ = (v >> 8) & 0xff;
121 *mPosition++ = v & 0xff;
123 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
127 void BigEndianBuffer::WriteULong(unsigned long v)
129 if ((unsigned int)(mPosition - mData + 3) < mSize) {
130 *mPosition++ = (v >> 24) & 0xff;
131 *mPosition++ = (v >> 16) & 0xff;
132 *mPosition++ = (v >> 8) & 0xff;
133 *mPosition++ = v & 0xff;
135 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
139 void BigEndianBuffer::WriteFixed(double d)
141 WriteLong(static_cast<long>(std::floor(d * 65536.0 + 0.5)));