亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? compress.c

?? 這是一個SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的參考價值.
?? C
字號:
/* -*- linux-c -*- ------------------------------------------------------- * *    *   Copyright 2001 H. Peter Anvin - All Rights Reserved * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139, *   USA; either version 2 of the License, or (at your option) any later *   version; incorporated herein by reference. * * ----------------------------------------------------------------------- *//* * linux/fs/isofs/compress.c * * Transparent decompression of files on an iso9660 filesystem */#include <linux/config.h>#include <linux/module.h>#include <linux/stat.h>#include <linux/sched.h>#include <linux/iso_fs.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/mm.h>#include <linux/string.h>#include <linux/locks.h>#include <linux/slab.h>#include <linux/errno.h>#include <linux/cdrom.h>#include <linux/init.h>#include <linux/nls.h>#include <linux/ctype.h>#include <linux/smp_lock.h>#include <linux/blkdev.h>#include <linux/vmalloc.h>#include <linux/zlib_fs.h>#include <asm/system.h>#include <asm/uaccess.h>#include <asm/semaphore.h>#include "zisofs.h"/* This should probably be global. */static char zisofs_sink_page[PAGE_CACHE_SIZE];/* * This contains the zlib memory allocation and the mutex for the * allocation; this avoids failures at block-decompression time. */static void *zisofs_zlib_workspace;static struct semaphore zisofs_zlib_semaphore;/* * When decompressing, we typically obtain more than one page * per reference.  We inject the additional pages into the page * cache as a form of readahead. */static int zisofs_readpage(struct file *file, struct page *page){	struct inode *inode = file->f_dentry->d_inode;	struct address_space *mapping = inode->i_mapping;	unsigned int maxpage, xpage, fpage, blockindex;	unsigned long offset;	unsigned long blockptr, blockendptr, cstart, cend, csize;	struct buffer_head *bh, *ptrbh[2];	unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);	unsigned int bufshift = ISOFS_BUFFER_BITS(inode);	unsigned long bufmask  = bufsize - 1;	int err = -EIO;	int i;	unsigned int header_size = inode->u.isofs_i.i_format_parm[0];	unsigned int zisofs_block_shift = inode->u.isofs_i.i_format_parm[1];	/* unsigned long zisofs_block_size = 1UL << zisofs_block_shift; */	unsigned int zisofs_block_page_shift = zisofs_block_shift-PAGE_CACHE_SHIFT;	unsigned long zisofs_block_pages = 1UL << zisofs_block_page_shift;	unsigned long zisofs_block_page_mask = zisofs_block_pages-1;	struct page *pages[zisofs_block_pages];	unsigned long index = page->index;	int indexblocks;	/* We have already been given one page, this is the one	   we must do. */	xpage = index & zisofs_block_page_mask;	pages[xpage] = page; 	/* The remaining pages need to be allocated and inserted */	offset = index & ~zisofs_block_page_mask;	blockindex = offset >> zisofs_block_page_shift;	maxpage = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;	maxpage = min(zisofs_block_pages, maxpage-offset);	for ( i = 0 ; i < maxpage ; i++, offset++ ) {		if ( i != xpage ) {			pages[i] = grab_cache_page_nowait(mapping, offset);		}		page = pages[i];		if ( page ) {			ClearPageError(page);			kmap(page);		}	}	/* This is the last page filled, plus one; used in case of abort. */	fpage = 0;	/* Find the pointer to this specific chunk */	/* Note: we're not using isonum_731() here because the data is known aligned */	/* Note: header_size is in 32-bit words (4 bytes) */	blockptr = (header_size + blockindex) << 2;	blockendptr = blockptr + 4;	indexblocks = ((blockptr^blockendptr) >> bufshift) ? 2 : 1;	ptrbh[0] = ptrbh[1] = 0;	if ( isofs_get_blocks(inode, blockptr >> bufshift, ptrbh, indexblocks) != indexblocks ) {		if ( ptrbh[0] ) brelse(ptrbh[0]);		printk(KERN_DEBUG "zisofs: Null buffer on reading block table, inode = %lu, block = %lu\n",		       inode->i_ino, blockptr >> bufshift);		goto eio;	}	ll_rw_block(READ, indexblocks, ptrbh);	bh = ptrbh[0];	if ( !bh || (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {		printk(KERN_DEBUG "zisofs: Failed to read block table, inode = %lu, block = %lu\n",		       inode->i_ino, blockptr >> bufshift);		if ( ptrbh[1] )			brelse(ptrbh[1]);		goto eio;	}	cstart = le32_to_cpu(*(u32 *)(bh->b_data + (blockptr & bufmask)));	if ( indexblocks == 2 ) {		/* We just crossed a block boundary.  Switch to the next block */		brelse(bh);		bh = ptrbh[1];		if ( !bh || (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {			printk(KERN_DEBUG "zisofs: Failed to read block table, inode = %lu, block = %lu\n",			       inode->i_ino, blockendptr >> bufshift);			goto eio;		}	}	cend = le32_to_cpu(*(u32 *)(bh->b_data + (blockendptr & bufmask)));	brelse(bh);	csize = cend-cstart;	/* Now page[] contains an array of pages, any of which can be NULL,	   and the locks on which we hold.  We should now read the data and	   release the pages.  If the pages are NULL the decompressed data	   for that particular page should be discarded. */		if ( csize == 0 ) {		/* This data block is empty. */		for ( fpage = 0 ; fpage < maxpage ; fpage++ ) {			if ( (page = pages[fpage]) != NULL ) {				memset(page_address(page), 0, PAGE_CACHE_SIZE);								flush_dcache_page(page);				SetPageUptodate(page);				kunmap(page);				UnlockPage(page);				if ( fpage == xpage )					err = 0; /* The critical page */				else					page_cache_release(page);			}		}	} else {		/* This data block is compressed. */		z_stream stream;		int bail = 0, left_out = -1;		int zerr;		int needblocks = (csize + (cstart & bufmask) + bufmask) >> bufshift;		int haveblocks;		struct buffer_head *bhs[needblocks+1];		struct buffer_head **bhptr;		/* Because zlib is not thread-safe, do all the I/O at the top. */		blockptr = cstart >> bufshift;		memset(bhs, 0, (needblocks+1)*sizeof(struct buffer_head *));		haveblocks = isofs_get_blocks(inode, blockptr, bhs, needblocks);		ll_rw_block(READ, haveblocks, bhs);		bhptr = &bhs[0];		bh = *bhptr++;		/* First block is special since it may be fractional.		   We also wait for it before grabbing the zlib		   semaphore; odds are that the subsequent blocks are		   going to come in in short order so we don't hold		   the zlib semaphore longer than necessary. */		if ( !bh || (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {			printk(KERN_DEBUG "zisofs: Hit null buffer, fpage = %d, xpage = %d, csize = %ld\n",			       fpage, xpage, csize);			goto b_eio;		}		stream.next_in  = bh->b_data + (cstart & bufmask);		stream.avail_in = min(bufsize-(cstart & bufmask), csize);		csize -= stream.avail_in;		stream.workspace = zisofs_zlib_workspace;		down(&zisofs_zlib_semaphore);				zerr = zlib_fs_inflateInit(&stream);		if ( zerr != Z_OK ) {			if ( err && zerr == Z_MEM_ERROR )				err = -ENOMEM;			printk(KERN_DEBUG "zisofs: zisofs_inflateInit returned %d\n",			       zerr);			goto z_eio;		}		while ( !bail && fpage < maxpage ) {			page = pages[fpage];			if ( page )				stream.next_out = page_address(page);			else				stream.next_out = (void *)&zisofs_sink_page;			stream.avail_out = PAGE_CACHE_SIZE;			while ( stream.avail_out ) {				int ao, ai;				if ( stream.avail_in == 0 && left_out ) {					if ( !csize ) {						printk(KERN_WARNING "zisofs: ZF read beyond end of input\n");						bail = 1;						break;					} else {						bh = *bhptr++;						if ( !bh ||						     (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {							/* Reached an EIO */ 							printk(KERN_DEBUG "zisofs: Hit null buffer, fpage = %d, xpage = %d, csize = %ld\n",							       fpage, xpage, csize);							       							bail = 1;							break;						}						stream.next_in = bh->b_data;						stream.avail_in = min(csize,bufsize);						csize -= stream.avail_in;					}				}				ao = stream.avail_out;  ai = stream.avail_in;				zerr = zlib_fs_inflate(&stream, Z_SYNC_FLUSH);				left_out = stream.avail_out;				if ( zerr == Z_BUF_ERROR && stream.avail_in == 0 )					continue;				if ( zerr != Z_OK ) {					/* EOF, error, or trying to read beyond end of input */					if ( err && zerr == Z_MEM_ERROR )						err = -ENOMEM;					if ( zerr != Z_STREAM_END )						printk(KERN_DEBUG "zisofs: zisofs_inflate returned %d, inode = %lu, index = %lu, fpage = %d, xpage = %d, avail_in = %d, avail_out = %d, ai = %d, ao = %d\n",						       zerr, inode->i_ino, index,						       fpage, xpage,						       stream.avail_in, stream.avail_out,						       ai, ao);					bail = 1;					break;				}			}			if ( stream.avail_out && zerr == Z_STREAM_END ) {				/* Fractional page written before EOF.  This may				   be the last page in the file. */				memset(stream.next_out, 0, stream.avail_out);				stream.avail_out = 0;			}			if ( !stream.avail_out ) {				/* This page completed */				if ( page ) {					flush_dcache_page(page);					SetPageUptodate(page);					kunmap(page);					UnlockPage(page);					if ( fpage == xpage )						err = 0; /* The critical page */					else						page_cache_release(page);				}				fpage++;			}		}		zlib_fs_inflateEnd(&stream);	z_eio:		up(&zisofs_zlib_semaphore);	b_eio:		for ( i = 0 ; i < haveblocks ; i++ ) {			if ( bhs[i] )				brelse(bhs[i]);		}	}eio:	/* Release any residual pages, do not SetPageUptodate */	while ( fpage < maxpage ) {		page = pages[fpage];		if ( page ) {			flush_dcache_page(page);			if ( fpage == xpage )				SetPageError(page);			kunmap(page);			UnlockPage(page);			if ( fpage != xpage )				page_cache_release(page);		}		fpage++;	}				/* At this point, err contains 0 or -EIO depending on the "critical" page */	return err;}struct address_space_operations zisofs_aops = {	readpage: zisofs_readpage,	/* No sync_page operation supported? */	/* No bmap operation supported */};static int initialized = 0;int __init zisofs_init(void){	if ( initialized ) {		printk("zisofs_init: called more than once\n");		return 0;	}	zisofs_zlib_workspace = vmalloc(zlib_fs_inflate_workspacesize());	if ( !zisofs_zlib_workspace )		return -ENOMEM;	init_MUTEX(&zisofs_zlib_semaphore);	initialized = 1;	return 0;}void __exit zisofs_cleanup(void){	if ( !initialized ) {		printk("zisofs_cleanup: called without initialization\n");		return;	}	vfree(zisofs_zlib_workspace);	initialized = 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91免费看视频| 国产婷婷色一区二区三区在线| 国模无码大尺度一区二区三区| 欧美一级久久久| 中文字幕在线不卡一区二区三区| 亚洲成人精品一区| 久久99精品久久久久久久久久久久 | 日本不卡一区二区三区高清视频| 成人免费看黄yyy456| 日韩一区二区视频| 亚洲国产精品一区二区尤物区| 不卡的av网站| 一区二区激情视频| 欧美一区二区三区四区久久| 蜜桃视频第一区免费观看| 久久亚洲精华国产精华液| 成人激情免费电影网址| 一区二区不卡在线播放| 欧美成人乱码一区二区三区| 国产99久久久精品| 亚洲va欧美va人人爽| 久久天堂av综合合色蜜桃网| 91麻豆视频网站| 美女脱光内衣内裤视频久久网站| 久久精品无码一区二区三区| 91国模大尺度私拍在线视频| 裸体在线国模精品偷拍| 中文字幕一区二区三区av| 欧美日韩高清一区二区| 国产精品99精品久久免费| 一区二区三区欧美久久| 26uuu久久天堂性欧美| 色综合天天综合网天天狠天天| 青椒成人免费视频| 日韩伦理免费电影| 精品国产伦理网| 在线免费观看不卡av| 国产在线播放一区二区三区| 亚洲福利电影网| 国产精品视频一二三区| 欧美xxxx老人做受| 欧美色图一区二区三区| 成人精品高清在线| 久久99国产精品麻豆| 亚洲国产欧美在线| 自拍偷拍欧美精品| 久久久久久电影| 5858s免费视频成人| 色综合久久综合网| 国产成人午夜精品影院观看视频 | 久久久久久99久久久精品网站| 在线日韩av片| 成人国产免费视频| 精品一区二区三区的国产在线播放 | 精品欧美久久久| 欧美午夜精品久久久久久超碰 | 日韩欧美www| 欧美亚洲综合另类| 99re这里都是精品| 国产白丝精品91爽爽久久| 国内精品伊人久久久久av一坑| 91在线小视频| 成人黄色一级视频| 国产aⅴ综合色| 国产成人精品免费| 国产一区二区三区久久久| 免费观看久久久4p| 日本午夜一区二区| 青青青爽久久午夜综合久久午夜| 亚洲综合图片区| 一区二区三区不卡视频| 亚洲日本一区二区三区| 亚洲视频 欧洲视频| 最近中文字幕一区二区三区| 国产精品久久二区二区| 中文成人综合网| 国产精品久久三| 亚洲欧洲精品一区二区三区不卡| 中文字幕高清一区| 国产精品欧美经典| 一区在线观看视频| 一区二区三区免费网站| 亚洲精品视频在线看| 亚洲尤物在线视频观看| 亚洲成人午夜电影| 六月丁香婷婷色狠狠久久| 九九**精品视频免费播放| 国产在线播放一区| 风流少妇一区二区| 91同城在线观看| 精品污污网站免费看| 91精品国产综合久久香蕉的特点| 日韩三级精品电影久久久| 精品不卡在线视频| 中文字幕精品一区二区三区精品| 国产精品第五页| 亚洲精品国产品国语在线app| 亚洲永久免费视频| 久久黄色级2电影| 国产98色在线|日韩| 97久久人人超碰| 欧美日韩一区在线| 日韩欧美国产高清| 国产精品免费aⅴ片在线观看| 亚洲美女在线国产| 奇米777欧美一区二区| 国产成人精品网址| 在线影视一区二区三区| 日韩女同互慰一区二区| 国产精品久久久久久久久免费丝袜| 一区二区三区四区不卡视频| 青青草国产精品97视觉盛宴| 国产成人午夜精品5599| 欧美日韩在线观看一区二区| 欧美精品一区二区三区四区 | 国内精品国产成人| 91老师国产黑色丝袜在线| 欧美日韩国产系列| 国产午夜三级一区二区三| 亚洲美女在线一区| 国产自产2019最新不卡| 欧洲一区二区三区在线| 亚洲精品在线观看网站| 亚洲最色的网站| 国产精品主播直播| 精品视频一区二区三区免费| 久久久精品综合| 亚洲18色成人| 99久久久久久| 26uuu亚洲婷婷狠狠天堂| 亚洲一区二区不卡免费| 成人妖精视频yjsp地址| 日韩一区二区三区观看| 亚洲精品精品亚洲| 成人一区二区视频| 精品国产一区二区在线观看| 亚洲午夜精品久久久久久久久| 国产成人啪午夜精品网站男同| 欧美日韩精品一区二区三区蜜桃| 国产精品情趣视频| 国产一区二区调教| 在线播放中文字幕一区| 亚洲精品免费电影| 成人丝袜视频网| 精品国产凹凸成av人网站| 日韩av一级片| 欧美群妇大交群中文字幕| 亚洲欧美日韩中文字幕一区二区三区 | 日韩美女视频一区二区在线观看| 亚洲人成电影网站色mp4| 国产成a人无v码亚洲福利| 欧美本精品男人aⅴ天堂| 日韩精品电影一区亚洲| 欧美日韩国产区一| 亚洲一区二区四区蜜桃| 色先锋aa成人| 亚洲欧美一区二区在线观看| 国产69精品久久久久毛片 | 亚洲国产精品激情在线观看| 日本aⅴ免费视频一区二区三区| 欧美三级一区二区| 亚洲国产日韩a在线播放| 欧美性一二三区| 一区二区高清在线| 欧美伊人久久久久久久久影院| ...av二区三区久久精品| 成人av网站免费观看| 中文字幕av在线一区二区三区| 国产乱理伦片在线观看夜一区| 欧美不卡一区二区三区四区| 久久国产精品露脸对白| 欧美精品一区二区久久久| 国产一区视频网站| 欧美激情一区二区三区蜜桃视频| 国产成人免费视频一区| 亚洲国产精品v| 99国产精品久| 亚洲电影在线免费观看| 91麻豆精品91久久久久同性| 免费观看30秒视频久久| 久久嫩草精品久久久精品| 国产精品1区2区| 国产精品的网站| 色综合色综合色综合色综合色综合| 亚洲精品乱码久久久久久黑人| 在线免费观看一区| 免费看日韩a级影片| 久久久久久免费毛片精品| 成人毛片老司机大片| 一二三区精品福利视频| 91精品婷婷国产综合久久性色| 精品午夜一区二区三区在线观看| 久久久久高清精品| 91蜜桃视频在线| 日本v片在线高清不卡在线观看| 久久久久久亚洲综合| 色偷偷成人一区二区三区91 | 久久av老司机精品网站导航| 久久精品视频免费| 色综合久久天天|