erl_interface.h

来自「OTP是开放电信平台的简称」· C头文件 代码 · 共 429 行

H
429
字号
/* ``The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved via the world wide web at http://www.erlang.org/. *  * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. *  * The Initial Developer of the Original Code is Ericsson Utvecklings AB. * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings * AB. All Rights Reserved.'' *  *     $Id$ */#ifndef _ERL_INTERFACE_H#define _ERL_INTERFACE_H/************************************************************************//*      This file defines the complete interface to erl_interface       *//*      Note: the 'ei' interface is the prefered C API.                 *//************************************************************************//* FIXME only include if needed? */ #include "ei.h"			/* ei is the base *//* -------------------------------------------------------------------- *//*                           Public defines                             *//* -------------------------------------------------------------------- */#define ERL_COMPOUND (1 << 7)#define ERL_UNDEF        0#define ERL_INTEGER      1#define ERL_U_INTEGER    2 /* unsigned int */#define ERL_ATOM         3#define ERL_PID          4#define ERL_PORT         5#define ERL_REF          6#define ERL_CONS         (7 | ERL_COMPOUND)#define ERL_LIST         ERL_CONS#define ERL_NIL          8#define ERL_EMPTY_LIST   ERL_NIL#define ERL_TUPLE        (9 | ERL_COMPOUND)#define ERL_BINARY      10#define ERL_FLOAT       11#define ERL_VARIABLE    (12 | ERL_COMPOUND) /* used in patterns */#define ERL_SMALL_BIG   13#define ERL_U_SMALL_BIG 14#define ERL_FUNCTION    (15 | ERL_COMPOUND)#define ERL_BIG         16#define ERL_TYPE(x)       (ERL_HEADER(x)->type)/* FIXME some macros left in erl_eterm.h should probably be documented */#define ERL_IS_INTEGER(x)  (ERL_TYPE(x) == ERL_INTEGER)#define ERL_IS_UNSIGNED_INTEGER(x)  (ERL_TYPE(x) == ERL_U_INTEGER)#define ERL_IS_FLOAT(x)    (ERL_TYPE(x) == ERL_FLOAT)#define ERL_IS_ATOM(x)     (ERL_TYPE(x) == ERL_ATOM)#define ERL_IS_PID(x)      (ERL_TYPE(x) == ERL_PID)#define ERL_IS_PORT(x)     (ERL_TYPE(x) == ERL_PORT)#define ERL_IS_REF(x)      (ERL_TYPE(x) == ERL_REF)#define ERL_IS_TUPLE(x)    (ERL_TYPE(x) == ERL_TUPLE)#define ERL_IS_BINARY(x)   (ERL_TYPE(x) == ERL_BINARY)#define ERL_IS_NIL(x)      (ERL_TYPE(x) == ERL_NIL)#define ERL_IS_EMPTY_LIST(x) ERL_IS_NIL(x)#define ERL_IS_CONS(x)     (ERL_TYPE(x) == ERL_CONS)#define ERL_IS_LIST(x)     (ERL_IS_CONS(x) || ERL_IS_EMPTY_LIST(x))/* * Macros used for XXXX */#define ERL_HEADER(x)     ((Erl_Header *)x)#define ERL_COUNT(x)      (ERL_HEADER(x)->count)/* * Macros used for retrieving values from Erlang terms. */#define ERL_INT_VALUE(x) ((x)->uval.ival.i)#define ERL_INT_UVALUE(x) ((x)->uval.uival.u)#define ERL_FLOAT_VALUE(x) ((x)->uval.fval.f)#define ERL_ATOM_PTR(x) ((x)->uval.aval.a)#define ERL_ATOM_SIZE(x) ((x)->uval.aval.len)#define ERL_PID_NODE(x) ((x)->uval.pidval.node)#define ERL_PID_NUMBER(x) ((x)->uval.pidval.number)#define ERL_PID_SERIAL(x) ((x)->uval.pidval.serial)#define ERL_PID_CREATION(x) ((x)->uval.pidval.creation)#define ERL_PORT_NODE(x) ((x)->uval.portval.node)#define ERL_PORT_NUMBER(x) ((x)->uval.portval.number)#define ERL_PORT_CREATION(x) ((x)->uval.portval.creation)#define ERL_REF_NODE(x) ((x)->uval.refval.node)#define ERL_REF_NUMBER(x) ((x)->uval.refval.n[0])#define ERL_REF_NUMBERS(x) ((x)->uval.refval.n)#define ERL_REF_LEN(x) ((x)->uval.refval.len)#define ERL_REF_CREATION(x) ((x)->uval.refval.creation)#define ERL_TUPLE_SIZE(x) ((x)->uval.tval.size)/* NOTE!!! This is 0-based!! (first item is number 0) * Note too that element/2 (in Erlang) and * erl_element() are both 1-based. */#define ERL_TUPLE_ELEMS(x) ((x)->uval.tval.elems)#define ERL_TUPLE_ELEMENT(x, i) (ERL_TUPLE_ELEMS(x)[(i)])#define ERL_BIN_SIZE(x) ((x)->uval.bval.size)#define ERL_BIN_PTR(x) ((x)->uval.bval.b)#define ERL_CONS_HEAD(x) ((x)->uval.lval.head)#define ERL_CONS_TAIL(x) ((x)->uval.lval.tail)#define ERL_VAR_LEN(x) ((x)->uval.vval.len)#define ERL_VAR_NAME(x) ((x)->uval.vval.name)#define ERL_VAR_VALUE(x) ((x)->uval.vval.v)#define ERL_CLOSURE_SIZE(x)  ((x)->uval.funcval.size)#define ERL_FUN_CREATOR(x)   ((x)->uval.funcval.creator)#define ERL_FUN_MODULE(x)    ((x)->uval.funcval.module)#define ERL_FUN_UNIQ(x)      ((x)->uval.funcval.uniq)#define ERL_FUN_INDEX(x)     ((x)->uval.funcval.index)#define ERL_FUN_ARITY(x)     ((x)->uval.funcval.arity)#define ERL_FUN_NEW_INDEX(x) ((x)->uval.funcval.new_index)#define ERL_FUN_MD5(x)       ((x)->uval.funcval.md5)#define ERL_CLOSURE(x)       ((x)->uval.funcval.closure)#define ERL_CLOSURE_ELEMENT(x,i) (ERL_CLOSURE(x)[(i)])#ifdef __cplusplusextern "C" {#endif/* -------------------------------------------------------------------- *//*              Type definitions of Erlang terms in C                   *//* -------------------------------------------------------------------- */typedef struct {  unsigned int count:24;	/* reference counter */  unsigned int type:8;		/* type of Erlang term */} Erl_Header;typedef struct {  Erl_Header h;  int i;} Erl_Integer;typedef struct {  Erl_Header h;  unsigned int u;} Erl_Uinteger;typedef struct {  Erl_Header h;  double f;} Erl_Float;typedef struct {  Erl_Header h;  int len;  unsigned char *a;} Erl_Atom;typedef struct {  Erl_Header h;  unsigned char * node;  unsigned int number;  unsigned int serial;  unsigned char creation;} Erl_Pid;typedef struct {      Erl_Header h;  unsigned char * node;  unsigned int number;  unsigned char creation;} Erl_Port;typedef struct {  Erl_Header h;  unsigned char * node;  int len;  unsigned int n[3];  unsigned char creation;} Erl_Ref;typedef struct {  Erl_Header h;  int arity;  int is_neg;  unsigned short *digits;} Erl_Big;struct _eterm; /* forward */    typedef struct {  Erl_Header h;  struct _eterm *head;  struct _eterm *tail;} Erl_List;typedef struct {  Erl_Header h;} Erl_EmptyList;typedef struct {  Erl_Header h;  int size;  struct _eterm **elems;} Erl_Tuple;typedef struct {  Erl_Header h;  int size;  unsigned char *b;} Erl_Binary;/* Variables may only exist in patterns.  * Note: identical variable names in a pattern  * denotes the same value. */typedef struct {      Erl_Header h;  int len;             unsigned char *name;          struct _eterm *v;  } Erl_Variable;typedef struct {    Erl_Header h;    int size;			/* size of closure */    int arity;			/* arity for new (post R7) external funs */    unsigned char md5[16];	/* md5 for new funs */    int new_index;		/* new funs */    struct _eterm*  creator;	/* pid */    struct _eterm*  module;	/* module */    struct _eterm*  index;    struct _eterm*  uniq;    struct _eterm** closure;} Erl_Function;typedef struct _eterm {  union {    Erl_Integer   ival;    Erl_Uinteger  uival;     Erl_Float     fval;    Erl_Atom      aval;    Erl_Pid       pidval;         Erl_Port      portval;        Erl_Ref       refval;       Erl_List      lval;    Erl_EmptyList nval;    Erl_Tuple     tval;    Erl_Binary    bval;    Erl_Variable  vval;    Erl_Function  funcval;    Erl_Big       bigval;  } uval;} ETERM;#define MAXREGLEN 255  /* max length of registered (atom) name */typedef struct {  int type;   /* one of the message type constants in eiext.h */  ETERM *msg; /* the actual message */  ETERM *from;  ETERM *to;  unsigned char to_name[MAXREGLEN+1];} ErlMessage;typedef unsigned char Erl_Heap;/* -------------------------------------------------------------------- *//*                          The functions                               *//* -------------------------------------------------------------------- */void   erl_init(void *x, long y);void   erl_set_compat_rel(unsigned);int    erl_connect_init(int, char*,short);int    erl_connect_xinit(char*,char*,char*,struct in_addr*,char*,short);int    erl_connect(char*); int    erl_xconnect(struct in_addr*,char *);int    erl_close_connection(int);int    erl_receive(int, unsigned char*, int);int    erl_receive_msg(int, unsigned char*, int, ErlMessage*);int    erl_xreceive_msg(int, unsigned char**, int*, ErlMessage*);int    erl_send(int, ETERM*, ETERM*);int    erl_reg_send(int, char*, ETERM*);ETERM *erl_rpc(int,char*,char*,ETERM*);int    erl_rpc_to(int,char*,char*,ETERM*);int    erl_rpc_from(int,int,ErlMessage*);/* erl_publish returns open descriptor on success, or -1 */int    erl_publish(int port);int    erl_accept(int,ErlConnect*);const char *erl_thiscookie(void);const char *erl_thisnodename(void);const char *erl_thishostname(void);const char *erl_thisalivename(void);short       erl_thiscreation(void);/* returns 0 on success, -1 if node not known to epmd or epmd not reached */int    erl_unpublish(const char *alive);/* Report generic error to stderr. */void   erl_err_msg(const char * __template, ...)       __attribute__ ((__format__ (printf, 1, 2)));/* Report generic error to stderr and die. */void   erl_err_quit(const char * __template, ...)       __attribute__ ((__format__ (printf, 1, 2), __noreturn__));/* Report system/libc error to stderr. */void   erl_err_ret(const char * __template, ...)       __attribute__ ((__format__ (printf, 1, 2)));/* Report system/libc error to stderr and die. */void   erl_err_sys(const char * __template, ...)       __attribute__ ((__format__ (printf, 1, 2), __noreturn__));ETERM *erl_cons(ETERM*,ETERM*);ETERM *erl_copy_term(const ETERM*);ETERM *erl_element(int,const ETERM*);ETERM *erl_hd(const ETERM*);ETERM* erl_iolist_to_binary(const ETERM* term);char*  erl_iolist_to_string(const ETERM* term);int    erl_iolist_length(const ETERM*);int    erl_length(const ETERM*);ETERM *erl_mk_atom(const char*);ETERM *erl_mk_binary(const char*,int);ETERM *erl_mk_empty_list(void);ETERM *erl_mk_estring(const char*, int);ETERM *erl_mk_float(double);ETERM *erl_mk_int(int);ETERM *erl_mk_list(ETERM**,int);ETERM *erl_mk_pid(const char*,unsigned int,unsigned int,unsigned char);ETERM *erl_mk_port(const char*,unsigned int,unsigned char);ETERM *erl_mk_ref(const char*,unsigned int,unsigned char);ETERM *erl_mk_long_ref(const char*,unsigned int,unsigned int,		       unsigned int,unsigned char);ETERM *erl_mk_string(const char*);ETERM *erl_mk_tuple(ETERM**,int);ETERM *erl_mk_uint(unsigned int);ETERM *erl_mk_var(const char*);int    erl_print_term(FILE*,const ETERM*);/* int    erl_sprint_term(char*,const ETERM*); */int    erl_size(const ETERM*);ETERM *erl_tl(const ETERM*);ETERM *erl_var_content(const ETERM*, const char*);ETERM *erl_format(char*, ... );int    erl_match(ETERM*, ETERM*);char **erl_global_names(int fd, int *count);int    erl_global_register(int fd, const char *name, ETERM *pid);int    erl_global_unregister(int fd, const char *name);ETERM *erl_global_whereis(int fd, const char *name, char *node);void   erl_init_malloc(Erl_Heap*,long);ETERM *erl_alloc_eterm(unsigned char);void   erl_eterm_release(void);void   erl_eterm_statistics(unsigned long*,unsigned long*);void   erl_free_array(ETERM**,int);void   erl_free_term(ETERM*);void   erl_free_compound(ETERM*);void  *erl_malloc(long);void   erl_free(void*);int    erl_compare_ext(unsigned char*, unsigned char*);ETERM *erl_decode(unsigned char*);ETERM *erl_decode_buf(unsigned char**);int    erl_encode(ETERM*,unsigned char*t);int    erl_encode_buf(ETERM*,unsigned char**);int    erl_ext_size(unsigned char*);unsigned char erl_ext_type(unsigned char*); /* Note: returned 'char' before R9C */unsigned char *erl_peek_ext(unsigned char*,int);int    erl_term_len(ETERM*);/* -------------------------------------------------------------------- *//*                      Wrappers around ei functions                    *//* -------------------------------------------------------------------- *//*  * Undocumented before R9C, included for compatibility with old code */struct hostent *erl_gethostbyname(const char *name);struct hostent *erl_gethostbyaddr(const char *addr, int len, int type);struct hostent *erl_gethostbyname_r(const char *name, 				    struct hostent *hostp, 				    char *buffer, 				    int buflen, 				    int *h_errnop);struct hostent *erl_gethostbyaddr_r(const char *addr,				    int length, 				    int type, 				    struct hostent *hostp,				    char *buffer,  				    int buflen, 				    int *h_errnop);/*  * Undocumented, included for compatibility with old code */void erl_init_resolve(void);int erl_distversion(int fd);int erl_epmd_connect(struct in_addr *inaddr);int erl_epmd_port(struct in_addr *inaddr, const char *alive, int *dist);#ifdef __cplusplus}#endif#endif

⌨️ 快捷键说明

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