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

📄 xlog.c

📁 牛顿插值方法求解多项式的系数
💻 C
字号:
/* * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis * All rights reserved.  The file named COPYRIGHT specifies the terms  * and conditions for redistribution. */#include "config.h"#include <stdlib.h>#include <stdarg.h>#include "xlog.h"#include "impl.h"extern struct xlog_ops __xlog_filelog_ops ;#ifndef NO_SYSLOGextern struct xlog_ops __xlog_syslog_ops ;#endifstruct lookup_table{	struct xlog_ops	*ops ;	xlog_e		type ;} ;static struct lookup_table ops_lookup_table[] ={	{ &__xlog_filelog_ops,	XLOG_FILELOG },#ifndef NO_SYSLOG	{ &__xlog_syslog_ops,	XLOG_SYSLOG },#endif	{ NULL,                 0           }} ;#define CALLBACK( xp, status ) 				\	if ( (xp)->xl_callback ) 			\		(*(xp)->xl_callback)( (xlog_h)(xp), status, (xp)->xl_callback_arg )static void xlog_link( xlog_s *client, xlog_s *server ) ;static void xlog_unlink( xlog_s *xp ) ;static struct xlog_ops *xlog_ops_lookup( xlog_e type ){	struct lookup_table *ltp ;	for ( ltp = &ops_lookup_table[ 0 ] ; ltp->ops ; ltp++ )		if ( ltp->type == type )			break ;	return( ltp->ops ) ;}/* VARARGS3 */xlog_h xlog_create( xlog_e type, const char *id, int flags, ... ){	xlog_s				*xp ;	va_list				ap ;	struct xlog_ops	*xops ;	int				status ;	if ( ( xp = NEW( xlog_s ) ) == NULL )		return( NULL ) ;		if ( id == NULL || ( xp->xl_id = __xlog_new_string( id ) ) == NULL )	{		free( xp ) ;		return( NULL ) ;	}	xops = xlog_ops_lookup( type ) ;		if ( xops != NULL )	{		va_start( ap, flags ) ;		xp->xl_ops = xops ;		status = XL_INIT( xp, ap ) ;		va_end( ap ) ;		if ( status == XLOG_ENOERROR )		{			xp->xl_flags = flags ;			xp->xl_type = type ;			xp->xl_clients = XLOG_NULL ;			xp->xl_use = XLOG_NULL ;			return( (xlog_h) xp ) ;		}	}	free( xp->xl_id ) ;	free( xp ) ;	return( NULL ) ;}static void xlog_link( xlog_s *client, xlog_s *server ){	client->xl_use = server ;	if ( server == NULL )		return ;	if ( server->xl_clients == XLOG_NULL )	{		INIT_LINKS( client, xl_other_users ) ;		server->xl_clients = client ;	}	else		LINK( server, client, xl_other_users ) ;}static void xlog_unlink( xlog_s *xp ){	xlog_s *server = xp->xl_use ;	/*	 * Step 1: remove from server chain	 */	if ( server != XLOG_NULL )	{		if ( server->xl_clients == xp )			if ( NEXT( xp, xl_other_users ) == xp )				server->xl_clients = XLOG_NULL ;			else				server->xl_clients = NEXT( xp, xl_other_users ) ;		else			UNLINK( xp, xl_other_users ) ;	}	/*	 * Step 2: If we have users, clear their link to us.	 */	if ( xp->xl_clients != NULL )	{		xlog_s *xp2 = xp->xl_clients ;		do		{			xp2->xl_use = XLOG_NULL ;			xp2 = NEXT( xp2, xl_other_users ) ;		}		while ( xp2 != xp->xl_clients ) ;	}}static void xlog_flags( xlog_s *xp, xlog_cmd_e cmd, ... ){	va_list ap;	int	flag;	int	old_value;	int	*valp;	va_start(ap, cmd);	flag = va_arg( ap, int );	old_value = ((xp->xl_flags & flag) != 0);	valp = va_arg( ap, int * );	va_end(ap);	if ( cmd == XLOG_SETFLAG ) {		if ( *valp )			xp->xl_flags |= flag ;		else			xp->xl_flags &= ~flag ;	}	*valp = old_value ;}void xlog_destroy( xlog_h pxlog ){	xlog_s *xp = XP( pxlog ) ;	xlog_unlink( xp ) ;	XL_FINI( xp ) ;	free( xp->xl_id ) ;	free( xp ) ;}/* VARARGS4 */void xlog_write( xlog_h pxlog, const char buf[], int len, int flags, ... ){	xlog_s	*xp = XP( pxlog ) ;	va_list	ap ;	int		status ;	va_start( ap, flags ) ;	status = XL_WRITE( xp, buf, len, flags, ap ) ;	va_end( ap ) ;	if ( status != XLOG_ENOERROR )	{		CALLBACK( xp, status ) ;	}}/* VARARGS2 */int xlog_control( xlog_h pxlog, xlog_cmd_e cmd, ... ){	va_list	ap ;	xlog_s	*xp		= XP( pxlog ) ;	int		status	= XLOG_ENOERROR ;	va_start( ap, cmd ) ;	switch ( cmd )	{		case XLOG_LINK:			xlog_unlink( xp ) ;			xlog_link( xp, va_arg( ap, xlog_s * ) ) ;			xp->xl_callback_arg = va_arg( ap, void * ) ;			break ;				case XLOG_CALLBACK:			xp->xl_callback = va_arg( ap, voidfunc ) ;			break ;					case XLOG_GETFLAG:		case XLOG_SETFLAG:			xlog_flags( xp, cmd, ap ) ;			break ;		default:			status = XL_CONTROL( xp, cmd, ap ) ;	}	va_end( ap ) ;	return( status ) ;}int xlog_parms( xlog_e type, ... ){	va_list	ap ;	int		status ;	va_start( ap, type ) ;	switch ( type )	{#ifndef NO_SYSLOG		case XLOG_SYSLOG:			status = (*__xlog_syslog_ops.parms)( type, ap ) ;			break ;#endif		case XLOG_FILELOG:			status = (*__xlog_filelog_ops.parms)( type, ap ) ;			break ;				default:			status = XLOG_ENOERROR ;	}	va_end( ap ) ;	return( status ) ;}

⌨️ 快捷键说明

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