diff options
Diffstat (limited to 'plugins/adplug/libbinio/binstr.cpp')
-rw-r--r-- | plugins/adplug/libbinio/binstr.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/plugins/adplug/libbinio/binstr.cpp b/plugins/adplug/libbinio/binstr.cpp new file mode 100644 index 00000000..0e3a9f86 --- /dev/null +++ b/plugins/adplug/libbinio/binstr.cpp @@ -0,0 +1,114 @@ +/* + * 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 + * + * binstr.cpp - Binary I/O on standard C strings in memory + * Copyright (C) 2003 Simon Peter <dn.tlp@gmx.net> + */ + +#include "binstr.h" + +/***** binsbase *****/ + +binsbase::binsbase(void *str, unsigned long len) + : data((Byte *)str), spos((Byte *)str), length(len) +{ +} + +binsbase::~binsbase() +{ +} + +void binsbase::seek(long p, Offset offs) +{ + switch(offs) { + case Set: spos = data + p; break; + case Add: spos += p; break; + case End: spos = data + length - 1 + p; break; + } + + // Seek before start of data + if(spos < data) { + err |= Eof; + spos = data; + return; + } + + // Seek after end of data + if(spos - data >= length) { + err |= Eof; + spos = data + length - 1; + } +} + +long binsbase::pos() +{ + return (long)(spos - data); +} + +/***** binisstream *****/ + +binisstream::binisstream(void *str, unsigned long len) + : binsbase(str, len) +{ +} + +binisstream::~binisstream() +{ +} + +binisstream::Byte binisstream::getByte() +{ + Byte in = 0; + + if(spos - data >= length) + err |= Eof; + else { + in = *spos; + spos++; + } + + return in; +} + +/***** binosstream *****/ + +binosstream::binosstream(void *str, unsigned long len) + : binsbase(str, len) +{ +} + +binosstream::~binosstream() +{ +} + +void binosstream::putByte(Byte b) +{ + *spos = b; + spos++; + + if(spos - data >= length) + spos = data + length - 1; +} + +/***** binsstream *****/ + +binsstream::binsstream(void *str, unsigned long len) + : binsbase(str, len), binisstream(str, len), binosstream(str, len) +{ +} + +binsstream::~binsstream() +{ +} |