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

📄 unzip.c

📁 this gcc-g++-3.3.1.tar.gz is a source file of gcc, you can learn more about gcc through this codes f
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */		err=UNZ_ERRNO;	else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && 							  ((uFlags & 8)==0))		err=UNZ_BADZIPFILE;	if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK)		err=UNZ_ERRNO;	else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))		err=UNZ_BADZIPFILE;	*piSizeVar += (uInt)size_filename;	if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK)		err=UNZ_ERRNO;	*poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +									SIZEZIPLOCALHEADER + size_filename;	*psize_local_extrafield = (uInt)size_extra_field;	*piSizeVar += (uInt)size_extra_field;	return err;}												/*  Open for reading data the current file in the zipfile.  If there is no error and the file is opened, the return value is UNZ_OK.*/extern int ZEXPORT unzOpenCurrentFile (file)	unzFile file;{	int err=UNZ_OK;	int Store;	uInt iSizeVar;	unz_s* s;	file_in_zip_read_info_s* pfile_in_zip_read_info;	uLong offset_local_extrafield;  /* offset of the local extra field */	uInt  size_local_extrafield;    /* size of the local extra field */	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;	if (!s->current_file_ok)		return UNZ_PARAMERROR;    if (s->pfile_in_zip_read != NULL)        unzCloseCurrentFile(file);	if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,				&offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)		return UNZ_BADZIPFILE;	pfile_in_zip_read_info = (file_in_zip_read_info_s*)									    ALLOC(sizeof(file_in_zip_read_info_s));	if (pfile_in_zip_read_info==NULL)		return UNZ_INTERNALERROR;	pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);	pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;	pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;	pfile_in_zip_read_info->pos_local_extrafield=0;	if (pfile_in_zip_read_info->read_buffer==NULL)	{		TRYFREE(pfile_in_zip_read_info);		return UNZ_INTERNALERROR;	}	pfile_in_zip_read_info->stream_initialised=0;		if ((s->cur_file_info.compression_method!=0) &&        (s->cur_file_info.compression_method!=Z_DEFLATED))		err=UNZ_BADZIPFILE;	Store = s->cur_file_info.compression_method==0;	pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;	pfile_in_zip_read_info->crc32=0;	pfile_in_zip_read_info->compression_method =            s->cur_file_info.compression_method;	pfile_in_zip_read_info->file=s->file;	pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;    pfile_in_zip_read_info->stream.total_out = 0;	if (!Store)	{	  pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;	  pfile_in_zip_read_info->stream.zfree = (free_func)0;	  pfile_in_zip_read_info->stream.opaque = (voidpf)0;       	  err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);	  if (err == Z_OK)	    pfile_in_zip_read_info->stream_initialised=1;        /* windowBits is passed < 0 to tell that there is no zlib header.         * Note that in this case inflate *requires* an extra "dummy" byte         * after the compressed stream in order to complete decompression and         * return Z_STREAM_END.          * In unzip, i don't wait absolutely Z_STREAM_END because I known the          * size of both compressed and uncompressed data         */	}	pfile_in_zip_read_info->rest_read_compressed =             s->cur_file_info.compressed_size ;	pfile_in_zip_read_info->rest_read_uncompressed =             s->cur_file_info.uncompressed_size ;		pfile_in_zip_read_info->pos_in_zipfile =             s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + 			  iSizeVar;		pfile_in_zip_read_info->stream.avail_in = (uInt)0;	s->pfile_in_zip_read = pfile_in_zip_read_info;    return UNZ_OK;}/*  Read bytes from the current file.  buf contain buffer where data must be copied  len the size of buf.  return the number of byte copied if somes bytes are copied  return 0 if the end of file was reached  return <0 with error code if there is an error    (UNZ_ERRNO for IO error, or zLib error for uncompress error)*/extern int ZEXPORT unzReadCurrentFile  (file, buf, len)	unzFile file;	voidp buf;	unsigned len;{	int err=UNZ_OK;	uInt iRead = 0;	unz_s* s;	file_in_zip_read_info_s* pfile_in_zip_read_info;	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;	if (pfile_in_zip_read_info==NULL)		return UNZ_PARAMERROR;	if ((pfile_in_zip_read_info->read_buffer == NULL))		return UNZ_END_OF_LIST_OF_FILE;	if (len==0)		return 0;	pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;	pfile_in_zip_read_info->stream.avail_out = (uInt)len;		if (len>pfile_in_zip_read_info->rest_read_uncompressed)		pfile_in_zip_read_info->stream.avail_out = 		  (uInt)pfile_in_zip_read_info->rest_read_uncompressed;	while (pfile_in_zip_read_info->stream.avail_out>0)	{		if ((pfile_in_zip_read_info->stream.avail_in==0) &&            (pfile_in_zip_read_info->rest_read_compressed>0))		{			uInt uReadThis = UNZ_BUFSIZE;			if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)				uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;			if (uReadThis == 0)				return UNZ_EOF;			if (fseek(pfile_in_zip_read_info->file,                      pfile_in_zip_read_info->pos_in_zipfile +                          pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0)				return UNZ_ERRNO;			if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1,                         pfile_in_zip_read_info->file)!=1)				return UNZ_ERRNO;			pfile_in_zip_read_info->pos_in_zipfile += uReadThis;			pfile_in_zip_read_info->rest_read_compressed-=uReadThis;						pfile_in_zip_read_info->stream.next_in =                 (Bytef*)pfile_in_zip_read_info->read_buffer;			pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;		}		if (pfile_in_zip_read_info->compression_method==0)		{			uInt uDoCopy,i ;			if (pfile_in_zip_read_info->stream.avail_out <                             pfile_in_zip_read_info->stream.avail_in)				uDoCopy = pfile_in_zip_read_info->stream.avail_out ;			else				uDoCopy = pfile_in_zip_read_info->stream.avail_in ;							for (i=0;i<uDoCopy;i++)				*(pfile_in_zip_read_info->stream.next_out+i) =                        *(pfile_in_zip_read_info->stream.next_in+i);								pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,								pfile_in_zip_read_info->stream.next_out,								uDoCopy);			pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;			pfile_in_zip_read_info->stream.avail_in -= uDoCopy;			pfile_in_zip_read_info->stream.avail_out -= uDoCopy;			pfile_in_zip_read_info->stream.next_out += uDoCopy;			pfile_in_zip_read_info->stream.next_in += uDoCopy;            pfile_in_zip_read_info->stream.total_out += uDoCopy;			iRead += uDoCopy;		}		else		{			uLong uTotalOutBefore,uTotalOutAfter;			const Bytef *bufBefore;			uLong uOutThis;			int flush=Z_SYNC_FLUSH;			uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;			bufBefore = pfile_in_zip_read_info->stream.next_out;			/*			if ((pfile_in_zip_read_info->rest_read_uncompressed ==			         pfile_in_zip_read_info->stream.avail_out) &&				(pfile_in_zip_read_info->rest_read_compressed == 0))				flush = Z_FINISH;			*/			err=inflate(&pfile_in_zip_read_info->stream,flush);			uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;			uOutThis = uTotalOutAfter-uTotalOutBefore;						pfile_in_zip_read_info->crc32 =                 crc32(pfile_in_zip_read_info->crc32,bufBefore,                        (uInt)(uOutThis));			pfile_in_zip_read_info->rest_read_uncompressed -=                uOutThis;			iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);            			if (err==Z_STREAM_END)				return (iRead==0) ? UNZ_EOF : iRead;			if (err!=Z_OK) 				break;		}	}	if (err==Z_OK)		return iRead;	return err;}/*  Give the current position in uncompressed data*/extern z_off_t ZEXPORT unztell (file)	unzFile file;{	unz_s* s;	file_in_zip_read_info_s* pfile_in_zip_read_info;	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;	if (pfile_in_zip_read_info==NULL)		return UNZ_PARAMERROR;	return (z_off_t)pfile_in_zip_read_info->stream.total_out;}/*  return 1 if the end of file was reached, 0 elsewhere */extern int ZEXPORT unzeof (file)	unzFile file;{	unz_s* s;	file_in_zip_read_info_s* pfile_in_zip_read_info;	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;	if (pfile_in_zip_read_info==NULL)		return UNZ_PARAMERROR;		if (pfile_in_zip_read_info->rest_read_uncompressed == 0)		return 1;	else		return 0;}/*  Read extra field from the current file (opened by unzOpenCurrentFile)  This is the local-header version of the extra field (sometimes, there is    more info in the local-header version than in the central-header)  if buf==NULL, it return the size of the local extra field that can be read  if buf!=NULL, len is the size of the buffer, the extra header is copied in	buf.  the return value is the number of bytes copied in buf, or (if <0) 	the error code*/extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)	unzFile file;	voidp buf;	unsigned len;{	unz_s* s;	file_in_zip_read_info_s* pfile_in_zip_read_info;	uInt read_now;	uLong size_to_read;	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;	if (pfile_in_zip_read_info==NULL)		return UNZ_PARAMERROR;	size_to_read = (pfile_in_zip_read_info->size_local_extrafield - 				pfile_in_zip_read_info->pos_local_extrafield);	if (buf==NULL)		return (int)size_to_read;		if (len>size_to_read)		read_now = (uInt)size_to_read;	else		read_now = (uInt)len ;	if (read_now==0)		return 0;		if (fseek(pfile_in_zip_read_info->file,              pfile_in_zip_read_info->offset_local_extrafield + 			  pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0)		return UNZ_ERRNO;	if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1)		return UNZ_ERRNO;	return (int)read_now;}/*  Close the file in zip opened with unzipOpenCurrentFile  Return UNZ_CRCERROR if all the file was read but the CRC is not good*/extern int ZEXPORT unzCloseCurrentFile (file)	unzFile file;{	int err=UNZ_OK;	unz_s* s;	file_in_zip_read_info_s* pfile_in_zip_read_info;	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;	if (pfile_in_zip_read_info==NULL)		return UNZ_PARAMERROR;	if (pfile_in_zip_read_info->rest_read_uncompressed == 0)	{		if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)			err=UNZ_CRCERROR;	}	TRYFREE(pfile_in_zip_read_info->read_buffer);	pfile_in_zip_read_info->read_buffer = NULL;	if (pfile_in_zip_read_info->stream_initialised)		inflateEnd(&pfile_in_zip_read_info->stream);	pfile_in_zip_read_info->stream_initialised = 0;	TRYFREE(pfile_in_zip_read_info);    s->pfile_in_zip_read=NULL;	return err;}/*  Get the global comment string of the ZipFile, in the szComment buffer.  uSizeBuf is the size of the szComment buffer.  return the number of byte copied or an error code <0*/extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)	unzFile file;	char *szComment;	uLong uSizeBuf;{	int err=UNZ_OK;	unz_s* s;	uLong uReadThis ;	if (file==NULL)		return UNZ_PARAMERROR;	s=(unz_s*)file;	uReadThis = uSizeBuf;	if (uReadThis>s->gi.size_comment)		uReadThis = s->gi.size_comment;	if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0)		return UNZ_ERRNO;	if (uReadThis>0)    {      *szComment='\0';	  if (fread(szComment,(uInt)uReadThis,1,s->file)!=1)		return UNZ_ERRNO;    }	if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))		*(szComment+s->gi.size_comment)='\0';	return (int)uReadThis;}

⌨️ 快捷键说明

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