summaryrefslogtreecommitdiff
path: root/plugins/adplug/libbinio/binwrap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/adplug/libbinio/binwrap.cpp')
-rw-r--r--plugins/adplug/libbinio/binwrap.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/plugins/adplug/libbinio/binwrap.cpp b/plugins/adplug/libbinio/binwrap.cpp
new file mode 100644
index 00000000..740ee982
--- /dev/null
+++ b/plugins/adplug/libbinio/binwrap.cpp
@@ -0,0 +1,132 @@
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * binwrap.cpp - Binary I/O wrapper, using standard iostreams library
+ * Copyright (C) 2002, 2003 Simon Peter <dn.tlp@gmx.net>
+ */
+
+#include <stdio.h>
+#include "binwrap.h"
+
+#if BINIO_ENABLE_IOSTREAM
+
+/***** biniwstream *****/
+
+biniwstream::biniwstream(istream *istr)
+ : in(istr)
+{
+}
+
+biniwstream::~biniwstream()
+{
+}
+
+void biniwstream::seek(long pos, Offset offs)
+{
+ if(!in) { err = NotOpen; return; }
+
+ switch(offs) {
+ case Set: in->seekg(pos, ios::beg); break;
+ case Add: in->seekg(pos, ios::cur); break;
+ case End: in->seekg(pos, ios::end); break;
+ }
+}
+
+biniwstream::Byte biniwstream::getByte()
+{
+ if(!in) { err = NotOpen; return 0; }
+
+ int i = in->get();
+ if(i == EOF) err |= Eof;
+ return (Byte)i;
+}
+
+long biniwstream::pos()
+{
+ if(!in) { err = NotOpen; return 0; }
+ return (long)in->tellg();
+}
+
+/***** binowstream *****/
+
+binowstream::binowstream(ostream *ostr)
+ : out(ostr)
+{
+}
+
+binowstream::~binowstream()
+{
+}
+
+void binowstream::seek(long pos, Offset offs)
+{
+ if(!out) { err = NotOpen; return; }
+
+ switch(offs) {
+ case Set: out->seekp(pos, ios::beg); break;
+ case Add: out->seekp(pos, ios::cur); break;
+ case End: out->seekp(pos, ios::end); break;
+ }
+}
+
+void binowstream::putByte(binio::Byte b)
+{
+ if(!out) { err = NotOpen; return; }
+ out->put((char)b);
+}
+
+long binowstream::pos()
+{
+ if(!out) { err = NotOpen; return 0; }
+ return (long)out->tellp();
+}
+
+/***** binwstream *****/
+
+binwstream::binwstream(iostream *str)
+ : biniwstream(str), binowstream(str), io(str)
+{
+}
+
+binwstream::~binwstream()
+{
+}
+
+void binwstream::seek(long pos, Offset offs)
+{
+ biniwstream::seek(pos, offs);
+ binowstream::seek(pos, offs);
+}
+
+long binwstream::pos()
+{
+ if(!io) { err = NotOpen; return 0; }
+ return (long)io->tellg();
+}
+
+binwstream::Byte binwstream::getByte()
+{
+ Byte in = biniwstream::getByte();
+ binowstream::seek(biniwstream::pos(), Set); // sync stream position
+ return in;
+}
+
+void binwstream::putByte(Byte b)
+{
+ binowstream::putByte(b);
+ biniwstream::seek(binowstream::pos(), Set); // sync stream position
+}
+
+#endif