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

📄 bbuf.c

📁 下载来的一个看图软件的源代码
💻 C
字号:
/* libwmf (api/bbuf.c): library for wmf conversion   Copyright (C) 2000 - various; see CREDITS, ChangeLog, and sources   The libwmf Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Library General Public License as   published by the Free Software Foundation; either version 2 of the   License, or (at your option) any later version.   The libwmf 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   Library General Public License for more details.   You should have received a copy of the GNU Library General Public   License along with the libwmf Library; see the file COPYING.  If not,   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.  */#ifdef HAVE_CONFIG_H#include "wmfconfig.h"#endif#include <stdio.h>#include "wmfdefs.h"#include "api/bbuf.h"/** * Set custom metafile input-stream handler functions. *  * @param API       the API handle * @param fp_read   function to read a byte * @param fp_seek   function to set position * @param fp_tell   function to get position * @param user_data handle for user data *  * \b libwmf has simple methods for reading either from file or from memory, but many applications will want * to use customized variants of these. wmf_bbuf_input() enables this. *  * @verbatimtypedef int  (*wmfRead) (void* user_data);typedef int  (*wmfSeek) (void* user_data,long position);typedef long (*wmfTell) (void* user_data);@endverbatim *  * \b wmfRead returns unsigned char cast to int, or EOF (cf. fgetc()) *  * \b wmfSeek returns (-1) on error, otherwise 0 (cf. fseek()) *  * \b wmfTell returns (-1) on error, otherwise current position (cf. ftell()) *  * @return Returns the library error state (\b wmf_E_None on success). *         Possible library error state of \b wmf_E_Glitch, if any of the three functions is zero. */wmf_error_t wmf_bbuf_input (wmfAPI* API,wmfRead fp_read,wmfSeek fp_seek,wmfTell fp_tell,void* user_data){	if (ERR (API)) return (API->err);	if ((fp_read == 0) || (fp_seek == 0) || (fp_tell == 0))	{	WMF_ERROR (API,"wmf_bbuf_input: null arg. given unexpectedly!");		API->err = wmf_E_Glitch;	}	else	{	API->buffer_data = user_data;		API->bbuf.read = fp_read;		API->bbuf.seek = fp_seek;		API->bbuf.tell = fp_tell;	}	return (API->err);}/** * Open file as metafile. *  * @param API  the API handle * @param file file name *  * Simple method for reading from file. *  * @return Returns the library error state (\b wmf_E_None on success). *         Possible library error states of \b wmf_E_Glitch or \b wmf_E_BadFile. */wmf_error_t wmf_file_open (wmfAPI* API,const char* file){	wmfBBufFileInfo* file_info = 0;	if (ERR (API)) return (API->err);	if (API->buffer_data)	{	WMF_ERROR (API,"wmf_file_open: input stream already open!");		API->err = wmf_E_Glitch;		return (API->err);	}	file_info = (wmfBBufFileInfo*) wmf_malloc (API,sizeof (wmfBBufFileInfo));	if (ERR (API)) return (API->err);	if ((file_info->file = fopen (file,"rb")) == 0)	{	WMF_ERROR (API,"wmf_file_open: unable to open file for reading.");		wmf_free (API,file_info);		API->err = wmf_E_BadFile;		return (API->err);	}	wmf_bbuf_input (API,wmf_file_read,wmf_file_seek,wmf_file_tell,(void*) file_info);	if (ERR (API))	{	wmf_file_close (API);		return (API->err);	}	return (API->err);}/** * Close metafile input file stream. *  * @param API the API handle *  * @return Returns the library error state (\b wmf_E_None on success). *         Possible library error state of \b wmf_E_Glitch. */wmf_error_t wmf_file_close (wmfAPI* API){	wmfBBufFileInfo* file_info = (wmfBBufFileInfo*) (API->buffer_data);	if (API->buffer_data == 0)	{	WMF_ERROR (API,"wmf_file_close: attempt to close unopened stream!");		API->err = wmf_E_Glitch;		return (API->err);	}	fclose (file_info->file);	wmf_free (API,API->buffer_data);	API->buffer_data = 0;	API->bbuf.read = 0;	API->bbuf.seek = 0;	API->bbuf.tell = 0;	return (API->err);}/** * @internal */int wmf_file_read (void* user_data){	wmfBBufFileInfo* file_info = (wmfBBufFileInfo*) user_data;	return (fgetc (file_info->file));}/** * @internal */int wmf_file_seek (void* user_data,long pos){	wmfBBufFileInfo* file_info = (wmfBBufFileInfo*) user_data;	return (fseek (file_info->file,pos,SEEK_SET));}/** * @internal */long wmf_file_tell (void* user_data){	wmfBBufFileInfo* file_info = (wmfBBufFileInfo*) user_data;	return (ftell (file_info->file));}/** * Open metafile in memory. *  * @param API    the API handle * @param mem    the metafile in memory * @param length the length in bytes of metafile data *  * Simple method for reading from memory as array of unsigned char. *  * @return Returns the library error state (\b wmf_E_None on success). *         Possible library error state of \b wmf_E_Glitch. */wmf_error_t wmf_mem_open (wmfAPI* API,unsigned char* mem,long length){	wmfBBufMemInfo* mem_info = 0;	if (ERR (API)) return (API->err);	if (API->buffer_data)	{	WMF_ERROR (API,"wmf_mem_open: input stream already open!");		API->err = wmf_E_Glitch;		return (API->err);	}	if ((mem == 0) || (length <= 0))	{	WMF_ERROR (API,"wmf_mem_open: null or improper buffer!");		API->err = wmf_E_Glitch;		return (API->err);	}	mem_info = (wmfBBufMemInfo*) wmf_malloc (API,sizeof (wmfBBufMemInfo));	if (ERR (API)) return (API->err);	mem_info->mem = mem;	mem_info->ptr = mem;	mem_info->pos = 0;	mem_info->length = length;	wmf_bbuf_input (API,wmf_mem_read,wmf_mem_seek,wmf_mem_tell,(void*) mem_info);	if (ERR (API))	{	wmf_mem_close (API);		return (API->err);	}	return (API->err);}/** * Close metafile input memory stream. *  * @param API the API handle *  * @return Returns the library error state (\b wmf_E_None on success). */wmf_error_t wmf_mem_close (wmfAPI* API){	wmf_free (API,API->buffer_data);	API->buffer_data = 0;	API->bbuf.read = 0;	API->bbuf.seek = 0;	API->bbuf.tell = 0;	return (API->err);}/** * @internal */int wmf_mem_read (void* user_data){	int byte = EOF;	wmfBBufMemInfo* mem_info = (wmfBBufMemInfo*) user_data;	if (mem_info->pos < mem_info->length)	{	byte = (int) (*(mem_info->ptr));		mem_info->ptr++;		mem_info->pos++;	}	return (byte);}/** * @internal */int wmf_mem_seek (void* user_data,long pos){	wmfBBufMemInfo* mem_info = (wmfBBufMemInfo*) user_data;	if ((pos < 0) || (pos >= mem_info->length)) return (-1);	mem_info->ptr = mem_info->mem + pos;	mem_info->pos = pos;	return (0);}/** * @internal */long wmf_mem_tell (void* user_data){	wmfBBufMemInfo* mem_info = (wmfBBufMemInfo*) user_data;	return (mem_info->pos);}

⌨️ 快捷键说明

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