⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cstream.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
字号:
/*  *	HT Editor *	cstream.cc * *	Copyright (C) 1999-2002 Sebastian Biallas (sb@biallas.net) * *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License version 2 as *	published by the Free Software Foundation. * *	This program 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 General Public License for more details. * *	You should have received a copy of the GNU General Public License *	along with this program; if not, write to the Free Software *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "cstream.h"#include "htdebug.h"#include "except.h"#include "endianess.h"# ifdef USE_MINILZO#  include "minilzo/minilzo.h"# elif HAVE_LZO_LZO1X_H#  include <lzo/lzo1x.h># elif HAVE_LZO1X_H#  include <lzo1x.h># endif#include "tools.h"#include <string.h>CompressedStream::CompressedStream(Stream *stream, bool own_stream)	: StreamLayer(stream, own_stream){	if ((stream->getAccessMode() & (IOAM_READ | IOAM_WRITE)) == (IOAM_READ | IOAM_WRITE)) {		// ht_compressed_stream cant be used for read and write access simultaneously		assert(0);	}	bufferpos = 0;	buffersize = COMPRESSED_STREAM_DEFAULT_GRANULARITY;	buffer = ht_malloc(buffersize);}CompressedStream::~CompressedStream(){	if (getAccessMode() & IOAM_WRITE) {		flush_compressed();	}	free(buffer);}void CompressedStream::flush_compressed(){	if (bufferpos) {		byte cbuf[bufferpos + bufferpos / 64 + 16 + 3];		byte workbuf[LZO1X_1_MEM_COMPRESS];		lzo_uint cbuf_len;		byte n[4];		memset(workbuf, 0, sizeof workbuf);				lzo1x_1_compress(buffer, bufferpos, cbuf, &cbuf_len, workbuf);		createForeignInt(n, bufferpos, 4, big_endian);		mStream->writex(n, 4);		createForeignInt(n, cbuf_len, 4, big_endian);		mStream->writex(n, 4);		mStream->writex(cbuf, cbuf_len);		bufferpos = 0;	}}void CompressedStream::flush_uncompressed(){	if (bufferpos == 0) {		free(buffer);		buffer = NULL;		uint cbuf_len;		uint uncompressed_len;		byte n[4];		mStream->readx(n, 4);		uncompressed_len = createHostInt(n, 4, big_endian);		mStream->readx(n, 4);		cbuf_len = createHostInt(n, 4, big_endian);				if (!uncompressed_len || uncompressed_len > COMPRESSED_STREAM_DEFAULT_GRANULARITY		 || !cbuf_len || cbuf_len > 2*COMPRESSED_STREAM_DEFAULT_GRANULARITY) throw IOException(EIO);		buffer = ht_malloc(uncompressed_len);		byte cbuf[cbuf_len];		mStream->readx(cbuf, cbuf_len);		lzo_uint dummy = uncompressed_len;				lzo1x_decompress_safe(cbuf, cbuf_len, buffer, &dummy, NULL);		if (dummy != uncompressed_len) throw IOException(EIO);		buffersize = uncompressed_len;		bufferpos = uncompressed_len;          	}}uint CompressedStream::read(void *aBuf, uint size){	uint ssize = size;	byte *buf = (byte *)aBuf;	while (size >= bufferpos) {		memcpy(buf, buffer+buffersize-bufferpos, bufferpos);		buf += bufferpos;		size -= bufferpos;		bufferpos = 0;		if (size) {			try {				flush_uncompressed();			} catch (const EOFException &) {				return ssize - size;			}		} else break;	}	if (size) {		memcpy(buf, buffer+buffersize-bufferpos, size);		bufferpos -= size;	}	return ssize;}uint CompressedStream::write(const void *aBuf, uint size){	uint ssize = size;	const byte *buf = (const byte *)aBuf;	while (bufferpos+size >= buffersize) {		memcpy(buffer+bufferpos, buf, buffersize-bufferpos);		size -= buffersize-bufferpos;		buf += buffersize-bufferpos;		bufferpos = buffersize;		if (size) {			try {				flush_compressed();			} catch (const EOFException &) {				return ssize - size;			}		} else break;	}	if (size) {		memcpy(buffer+bufferpos, buf, size);		bufferpos += size;	}	return ssize;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -