DEADSOFTWARE

Rename .ih files to module.ih for simplicity
[odcread.git] / reader / reader.cc
1 #include "reader/module.ih"
3 namespace odc {
5 Reader::Reader(std::istream &rider): d_rider(rider), d_cancelled(false), d_readAlien(false), d_typeList(),
6 d_state(new ReaderState()) {}
8 SHORTCHAR Reader::readSChar() {
9 SHORTCHAR out;
10 d_rider.read(&out, 1);
11 return out;
12 }
14 void Reader::readSChar(SHORTCHAR *buf, size_t len) {
15 d_rider.read(buf, len);
16 }
18 CHAR Reader::readLChar() {
19 CHAR buf;
20 char *bufPtr = (char *)&buf;
21 d_rider.read(bufPtr, 2);
22 if (isLittleEndian()) {
23 return buf - 0x8000;
24 } else {
25 CHAR out;
26 char *outPtr = (char *)&out;
27 outPtr[0] = bufPtr[1]; outPtr[1] = bufPtr[0];
28 return out - 0x8000;
29 }
30 }
32 void Reader::readLChar(CHAR *buf, size_t len) {
33 for (int i = 0; i < len; ++i) {
34 buf[i] = readLChar();
35 }
36 /*
37 char *bufPtr = (char *)buf;
38 int len2 = len * 2;
39 d_rider.read(bufPtr, len2);
40 if (isBigEndian()) {
41 char tmp;
42 for (int i = 0; i < len2; i += 2) {
43 tmp = bufPtr[i];
44 bufPtr[i] = bufPtr[i + 1];
45 bufPtr[i + 1] = tmp;
46 }
47 }
48 */
49 }
51 BYTE Reader::readByte() {
52 BYTE out;
53 d_rider.read((char*)&out, 1);
54 return out;
55 }
57 SHORTINT Reader::readSInt() {
58 SHORTINT buf;
59 char *bufPtr = (char*)&buf;
60 d_rider.read(bufPtr, 2);
61 if (isLittleEndian()) {
62 return buf;
63 } else {
64 SHORTINT out;
65 char *outPtr = (char *)&out;
66 outPtr[0] = bufPtr[1]; outPtr[1] = bufPtr[0];
67 return out;
68 }
69 }
71 INTEGER Reader::readInt() {
72 INTEGER buf;
73 char *bufPtr = (char*)&buf;
74 d_rider.read(bufPtr, 4);
75 if (isLittleEndian()) {
76 return buf;
77 } else {
78 INTEGER out;
79 char *outPtr = (char *)&out;
80 outPtr[0] = bufPtr[3]; outPtr[1] = bufPtr[2]; outPtr[2] = bufPtr[1]; outPtr[3] = bufPtr[0];
81 return out;
82 }
83 }
85 void Reader::readSString(SHORTCHAR *out) {
86 while (*out = readSChar()) {
87 ++out;
88 }
89 }
91 void Reader::turnIntoAlien(int cause) {
92 assert(cause > 0);
93 d_cancelled = true;
94 d_cause = cause;
95 d_readAlien = true;
96 }
98 bool Reader::isCancelled() {
99 return d_cancelled;
102 } // namespace odc