OSDN Git Service

ゴミデーターを削除
[marathon/ShapeFusion.git] / BigEndianBuffer.cpp
1 /*
2  * This file is part of ShapeFusion (Copyright 2000 Tito Dal Canton)
3  *
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.
8  *
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.
13  *
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
17 */
18 #include <cmath>
19 #include <iostream>
20 #include "BigEndianBuffer.h"
21
22 BigEndianBuffer::BigEndianBuffer(unsigned int _size):
23                 GenericEndianBuffer(_size)
24 {
25
26 }
27
28 BigEndianBuffer::BigEndianBuffer(unsigned char *_data, unsigned int _size):
29                 GenericEndianBuffer(_data, _size)
30 {
31
32 }
33
34 BigEndianBuffer::~BigEndianBuffer(void)
35 {
36
37 }
38
39 short BigEndianBuffer::ReadShort(void)
40 {
41         if ((unsigned int)(mPosition - mData + 1) < mSize) {
42                 unsigned char   hi = *mPosition++,
43                                                 lo = *mPosition++;
44
45                 return (short)((hi << 8) | lo);
46         } else {
47                 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
48                 return 0;
49         }
50 }
51
52 unsigned short BigEndianBuffer::ReadUShort(void)
53 {
54         if ((unsigned int)(mPosition - mData + 1) < mSize) {
55                 unsigned char   hi = *mPosition++,
56                                                 lo = *mPosition++;
57                 
58                 return (unsigned short)((hi << 8) | lo);
59         } else {
60                 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
61                 return 0;
62         }
63 }
64
65 long BigEndianBuffer::ReadLong(void)
66 {
67         if ((unsigned int)(mPosition - mData + 3) < mSize) {
68                 unsigned char   a = *mPosition++,
69                                                 b = *mPosition++,
70                                                 c = *mPosition++,
71                                                 d = *mPosition++;
72                 
73                 return (long)((a << 24) | (b << 16) | (c << 8) | d);
74         } else {
75                 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
76                 return 0;
77         }
78 }
79
80 unsigned long BigEndianBuffer::ReadULong(void)
81 {
82         if ((unsigned int)(mPosition - mData + 3) < mSize) {
83                 unsigned char   a = *mPosition++,
84                                                 b = *mPosition++,
85                                                 c = *mPosition++,
86                                                 d = *mPosition++;
87                 
88                 return (unsigned long)((a << 24) | (b << 16) | (c << 8) | d);
89         } else {
90                 std::cerr << "BigEndianBuffer: attempted read beyond buffer limits\n";
91                 return 0;
92         }
93 }
94
95 void BigEndianBuffer::WriteShort(short v)
96 {
97         if ((unsigned int)(mPosition - mData + 1) < mSize) {
98                 *mPosition++ = (v >> 8) & 0xff;
99                 *mPosition++ = v & 0xff;
100         } else {
101                 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
102         }
103 }
104
105 void BigEndianBuffer::WriteUShort(unsigned short v)
106 {
107         if ((unsigned int)(mPosition - mData + 1) < mSize) {
108                 *mPosition++ = (v >> 8) & 0xff;
109                 *mPosition++ = v & 0xff;
110         } else {
111                 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
112         }
113 }
114
115 void BigEndianBuffer::WriteLong(long v)
116 {
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;
122         } else {
123                 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
124         }
125 }
126
127 void BigEndianBuffer::WriteULong(unsigned long v)
128 {
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;
134         } else {
135                 std::cerr << "BigEndianBuffer: attempted write beyond buffer limits\n";
136         }
137 }
138
139 void BigEndianBuffer::WriteFixed(double d)
140 {
141         WriteLong(static_cast<long>(std::floor(d * 65536.0 + 0.5)));
142 }