uncompress.c

来自「嵌入式系统设计与实例开发实验教材二源码 多线程应用程序设计 串行端口程序设计」· C语言 代码 · 共 78 行

C
78
字号
/* * uncompress.c * * (C) Copyright 1999 Linus Torvalds * * cramfs interfaces to the uncompression library. There's really just * three entrypoints: * *  - cramfs_uncompress_init() - called to initialize the thing. *  - cramfs_uncompress_exit() - tell me when you're done *  - cramfs_uncompress_block() - uncompress a block. * * NOTE NOTE NOTE! The uncompression is entirely single-threaded. We * only have one stream, and we'll initialize it only once even if it * then is used by multiple filesystems. */#include <linux/kernel.h>#include <linux/errno.h>#include <linux/vmalloc.h>#include <linux/zlib_fs.h>static z_stream stream;static int initialized;/* Returns length of decompressed data. */int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen){	int err;	stream.next_in = src;	stream.avail_in = srclen;	stream.next_out = dst;	stream.avail_out = dstlen;	err = zlib_fs_inflateReset(&stream);	if (err != Z_OK) {		printk("zlib_fs_inflateReset error %d\n", err);		zlib_fs_inflateEnd(&stream);		zlib_fs_inflateInit(&stream);	}	err = zlib_fs_inflate(&stream, Z_FINISH);	if (err != Z_STREAM_END)		goto err;	return stream.total_out;err:	printk("Error %d while decompressing!\n", err);	printk("%p(%d)->%p(%d)\n", src, srclen, dst, dstlen);	return 0;}int cramfs_uncompress_init(void){	if (!initialized++) {		stream.workspace = vmalloc(zlib_fs_inflate_workspacesize());		if ( !stream.workspace ) {			initialized = 0;			return -ENOMEM;		}		stream.next_in = NULL;		stream.avail_in = 0;		zlib_fs_inflateInit(&stream);	}	return 0;}int cramfs_uncompress_exit(void){	if (!--initialized) {		zlib_fs_inflateEnd(&stream);		vfree(stream.workspace);	}	return 0;}

⌨️ 快捷键说明

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