AcePerl
view release on metacpan or search on metacpan
acelib/call.c view on Meta::CPAN
/* File: call.c
* Author: Richard Durbin (rd@sanger.ac.uk)
* Copyright (C) J Thierry-Mieg and R Durbin, 1994
*-------------------------------------------------------------------
* This file is part of the ACEDB genome database package, written by
* Richard Durbin (MRC LMB, UK) rd@mrc-lmb.cam.ac.uk, and
* Jean Thierry-Mieg (CRBM du CNRS, France) mieg@kaa.cnrs-mop.fr
*
* Description: provides hooks to optional code, basically a call by
name dispatcher
plus wscripts/ interface
* Exported functions:
* HISTORY:
* Last edited: Nov 19 14:40 1998 (fw)
* * Mar 3 15:51 1996 (rd)
* Created: Mon Oct 3 14:05:37 1994 (rd)
*-------------------------------------------------------------------
*/
/* $Id: call.c,v 1.1 2002/11/14 20:00:06 lstein Exp $ */
#include "acedb.h"
#include "call.h"
#include "mytime.h"
#include <ctype.h> /* for isprint */
/************************* call by name package *********************/
typedef struct
{ char *name ;
CallFunc func ;
} CALL ;
static Array calls ; /* array of CALL to store registered routines */
/************************************/
static int callOrder (void *a, void *b)
{ return strcmp (((CALL*)a)->name, ((CALL*)b)->name) ; }
void callRegister (char *name, CallFunc func)
{
CALL c ;
if (!calls)
calls = arrayCreate (16, CALL) ;
c.name = name ; c.func = func ;
if (!arrayInsert (calls, &c, callOrder))
messcrash ("Duplicate callRegister with name %s", name) ;
}
BOOL callExists (char *name)
{
CALL c ;
int i;
c.name = name ;
return (calls && arrayFind (calls, &c, &i, callOrder)) ;
}
#include <stdarg.h> /* for va_start */
BOOL call (char *name, ...)
{
va_list args ;
CALL c ;
int i ;
c.name = name ;
if (calls && arrayFind (calls, &c, &i, callOrder))
{ va_start(args, name) ;
(*(arr(calls,i,CALL).func))(args) ;
va_end(args) ;
return TRUE ;
( run in 1.851 second using v1.01-cache-2.11-cpan-5837b0d9d2c )