diff --git a/reader.cc b/reader.cc
index b027bd57299f3347c75b7c87d98c8dbcddc73c37..f53e30a8e896035d8a769d2de4cf10b27c9e8d33 100644 (file)
--- a/reader.cc
+++ b/reader.cc
return out;
}
+void Reader::readSChar(SHORTCHAR *buf, size_t len) {
+ d_rider.read(buf, len);
+}
+
+CHAR Reader::readLChar() {
+ CHAR buf;
+ char *bufPtr = (char *)&buf;
+ d_rider.read(bufPtr, 2);
+ if (isLittleEndian()) {
+ return buf;
+ } else {
+ CHAR out;
+ char *outPtr = (char *)&out;
+ outPtr[0] = bufPtr[1]; outPtr[1] = bufPtr[0];
+ return out;
+ }
+}
+
+void Reader::readLChar(CHAR *buf, size_t len) {
+ char *bufPtr = (char *)buf;
+ int len2 = len * 2;
+ d_rider.read(bufPtr, len2);
+ if (isBigEndian()) {
+ char tmp;
+ for (int i = 0; i < len2; i += 2) {
+ tmp = bufPtr[i];
+ bufPtr[i] = bufPtr[i + 1];
+ bufPtr[i + 1] = tmp;
+ }
+ }
+}
+
BYTE Reader::readByte() {
BYTE out;
d_rider.read((char*)&out, 1);
}
INTEGER Reader::readInt() {
- char *buf = new char[4];
- d_rider.read(buf, 4);
+ INTEGER buf;
+ char *bufPtr = (char*)&buf;
+ d_rider.read(bufPtr, 4);
if (isLittleEndian()) {
- return *(INTEGER *)buf;
+ return buf;
} else {
- char *out = new char[4];
- out[0] = buf[3]; out[1] = buf[2]; out[2] = buf[1]; out[3] = buf[0];
- return *(INTEGER *)out;
+ INTEGER out;
+ char *outPtr = (char *)&out;
+ outPtr[0] = bufPtr[3]; outPtr[1] = bufPtr[2]; outPtr[2] = bufPtr[1]; outPtr[3] = bufPtr[0];
+ return out;
}
}
// kind: SHORTCHAR; path: TypePath; type: TypeName;
// save: ReaderState;
Store *Reader::readNilStore() {
+ INTEGER comment = readInt();
+ std::streamoff next = readInt();
+ d_state->end = d_rider.tellg();
+ if (next > 0 || (next == 0 && comment % 2 == 1)) {
+ d_state->next = d_state->end + next;
+ } else {
+ d_state->next = 0;
+ }
return 0;
}
// IF kind = nil THEN