/*\
||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
||| See the files COPYING and DISCLAIMER for more information.
\*/

/*
 * $Id: constants.h,v 1.18 2001/07/02 04:09:47 hubbe Exp $
 */
#ifndef ADD_EFUN_H
#define ADD_EFUN_H

#include "svalue.h"
#include "hashtable.h"
#include "las.h" /* For OPT_SIDE_EFFECT etc. */
#include "block_alloc_h.h"

typedef int (*docode_fun)(node *n);
typedef node *(*optimize_fun)(node *n);

struct callable
{
  PIKE_MEMORY_OBJECT_MEMBERS;
  c_fun function;
  struct pike_type *type;
  struct pike_string *name;
  INT16 flags;
#ifdef PIKE_DEBUG
  INT8 may_return_void;
  long compiles;
  long runs;
#endif
  optimize_fun optimize;
  docode_fun docode;
  struct callable *next;
};

/* Prototypes begin here */
PMOD_EXPORT struct mapping *get_builtin_constants(void);
void low_add_efun(struct pike_string *name, struct svalue *fun);
void low_add_constant(char *name, struct svalue *fun);
PMOD_EXPORT void add_global_program(char *name, struct program *p);
BLOCK_ALLOC(callable,128)
PMOD_EXPORT struct callable *low_make_callable(c_fun fun,
				   struct pike_string *name,
				   struct pike_type *type,
				   INT16 flags,
				   optimize_fun optimize,
				   docode_fun docode);
PMOD_EXPORT struct callable *make_callable(c_fun fun,
			       char *name,
			       char *type,
			       INT16 flags,
			       optimize_fun optimize,
			       docode_fun docode);
PMOD_EXPORT struct callable *add_efun2(char *name,
			    c_fun fun,
			    char *type,
			    INT16 flags,
			    optimize_fun optimize,
			    docode_fun docode);
PMOD_EXPORT struct callable *add_efun(char *name, c_fun fun, char *type, INT16 flags);
PMOD_EXPORT struct callable *quick_add_efun(char *name, ptrdiff_t name_length,
					    c_fun fun,
					    char *type, ptrdiff_t type_length,
					    INT16 flags,
					    optimize_fun optimize,
					    docode_fun docode);
void cleanup_added_efuns(void);
/* Prototypes end here */


#include "pike_macros.h"

#define ADD_EFUN(NAME,FUN,TYPE,FLAGS) \
    quick_add_efun(NAME,CONSTANT_STRLEN(NAME),FUN,TYPE,CONSTANT_STRLEN(TYPE),FLAGS,0,0)

#define ADD_EFUN2(NAME,FUN,TYPE,FLAGS,OPTIMIZE,DOCODE) \
    quick_add_efun(NAME,CONSTANT_STRLEN(NAME),FUN,TYPE,CONSTANT_STRLEN(TYPE),FLAGS,OPTIMIZE,DOCODE)

#define ADD_EFUN_DTYPE(NAME,FUN,DTYPE,FLAGS) do {				\
  DTYPE_START;									\
  {DTYPE}									\
  {										\
    struct pike_string *_t;							\
    DTYPE_END(_t);								\
    quick_add_efun(NAME,CONSTANT_STRLEN(NAME),FUN,_t->str,_t->len,FLAGS,0,0);	\
    free_string(_t);								\
  }										\
} while (0)

#endif