/* * %CopyrightBegin% * * Copyright Ericsson AB 1996-2016. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * %CopyrightEnd% */ #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. */ /************************************************************************/ #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_LONGLONG 17 #define ERL_U_LONGLONG 18 #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_LONGLONG(x) (ERL_TYPE(x) == ERL_LONGLONG) #define ERL_IS_UNSIGNED_LONGLONG(x) (ERL_TYPE(x) == ERL_U_LONGLONG) #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_LL_VALUE(x) ((x)->uval.llval.i) #define ERL_LL_UVALUE(x) ((x)->uval.ullval.u) #define ERL_FLOAT_VALUE(x) ((x)->uval.fval.f) #define ERL_ATOM_PTR(x) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.aval.d) #define ERL_ATOM_PTR_UTF8(x) erl_atom_ptr_utf8((Erl_Atom_data*) &(x)->uval.aval.d) #define ERL_ATOM_SIZE(x) erl_atom_size_latin1((Erl_Atom_data*) &(x)->uval.aval.d) #define ERL_ATOM_SIZE_UTF8(x) erl_atom_size_utf8((Erl_Atom_data*) &(x)->uval.aval.d) #define ERL_PID_NODE(x) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.pidval.node) #define ERL_PID_NODE_UTF8(x) erl_atom_ptr_utf8((Erl_Atom_data*) &(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) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.portval.node) #define ERL_PORT_NODE_UTF8(x) erl_atom_ptr_utf8((Erl_Atom_data*) &(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) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.refval.node) #define ERL_REF_NODE_UTF8(x) erl_atom_ptr_utf8((Erl_Atom_data*) &(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 __cplusplus extern "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; long long i; } Erl_LLInteger; typedef struct { Erl_Header h; unsigned long long u; } Erl_ULLInteger; typedef struct { Erl_Header h; double f; } Erl_Float; typedef struct { char *utf8; int lenU; char *latin1; int lenL; } Erl_Atom_data; char* erl_atom_ptr_latin1(Erl_Atom_data*) EI_DEPRECATED_ATTR; char* erl_atom_ptr_utf8(Erl_Atom_data*) EI_DEPRECATED_ATTR; int erl_atom_size_latin1(Erl_Atom_data*) EI_DEPRECATED_ATTR; int erl_atom_size_utf8(Erl_Atom_data*) EI_DEPRECATED_ATTR; char* erl_atom_init_latin1(Erl_Atom_data*, const char*) EI_DEPRECATED_ATTR; typedef struct { Erl_Header h; Erl_Atom_data d; } Erl_Atom; typedef struct { Erl_Header h; Erl_Atom_data node; unsigned int number; unsigned int serial; unsigned int creation; } Erl_Pid; typedef struct { Erl_Header h; Erl_Atom_data node; unsigned int number; unsigned int creation; } Erl_Port; typedef struct { Erl_Header h; Erl_Atom_data node; int len; unsigned int n[3]; unsigned int 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; 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_LLInteger llval; Erl_ULLInteger ullval; 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*4) /* 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; char to_name[MAXREGLEN+1]; } ErlMessage; typedef unsigned char Erl_Heap; /* -------------------------------------------------------------------- */ /* The functions */ /* -------------------------------------------------------------------- */ void erl_init(void *x, long y) EI_DEPRECATED_ATTR; void erl_set_compat_rel(unsigned) EI_DEPRECATED_ATTR; int erl_connect_init(int, char*,short) EI_DEPRECATED_ATTR; int erl_connect_xinit(char*,char*,char*,struct in_addr*,char*,short) EI_DEPRECATED_ATTR; int erl_connect(char*) EI_DEPRECATED_ATTR; int erl_xconnect(struct in_addr*,char *) EI_DEPRECATED_ATTR; int erl_close_connection(int) EI_DEPRECATED_ATTR; int erl_receive(int, unsigned char*, int) EI_DEPRECATED_ATTR; int erl_receive_msg(int, unsigned char*, int, ErlMessage*) EI_DEPRECATED_ATTR; int erl_xreceive_msg(int, unsigned char**, int*, ErlMessage*) EI_DEPRECATED_ATTR; int erl_send(int, ETERM*, ETERM*) EI_DEPRECATED_ATTR; int erl_reg_send(int, char*, ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_rpc(int,char*,char*,ETERM*) EI_DEPRECATED_ATTR; int erl_rpc_to(int,char*,char*,ETERM*) EI_DEPRECATED_ATTR; int erl_rpc_from(int,int,ErlMessage*) EI_DEPRECATED_ATTR; /* erl_publish returns open descriptor on success, or -1 */ int erl_publish(int port) EI_DEPRECATED_ATTR; int erl_accept(int,ErlConnect*) EI_DEPRECATED_ATTR; const char *erl_thiscookie(void) EI_DEPRECATED_ATTR; const char *erl_thisnodename(void) EI_DEPRECATED_ATTR; const char *erl_thishostname(void) EI_DEPRECATED_ATTR; const char *erl_thisalivename(void) EI_DEPRECATED_ATTR; short erl_thiscreation(void) EI_DEPRECATED_ATTR; /* returns 0 on success, -1 if node not known to epmd or epmd not reached */ int erl_unpublish(const char *alive) EI_DEPRECATED_ATTR; #ifdef EI_HAVE_DEPRECATED_ATTR__ #define EI_DEPR_ATTR_EXTRA , EI_DEPRECATED_ATTR_NAME #else #define EI_DEPR_ATTR_EXTRA #endif /* Report generic error to stderr. */ void erl_err_msg(const char * __template, ...) __attribute__ ((__format__ (printf, 1, 2) EI_DEPR_ATTR_EXTRA)) ; /* Report generic error to stderr and die. */ void erl_err_quit(const char * __template, ...) __attribute__ ((__format__ (printf, 1, 2), __noreturn__ EI_DEPR_ATTR_EXTRA)); /* Report system/libc error to stderr. */ void erl_err_ret(const char * __template, ...) __attribute__ ((__format__ (printf, 1, 2) EI_DEPR_ATTR_EXTRA)); /* Report system/libc error to stderr and die. */ void erl_err_sys(const char * __template, ...) __attribute__ ((__format__ (printf, 1, 2), __noreturn__ EI_DEPR_ATTR_EXTRA)); ETERM *erl_cons(ETERM*,ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_copy_term(const ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_element(int,const ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_hd(const ETERM*) EI_DEPRECATED_ATTR; ETERM* erl_iolist_to_binary(const ETERM* term) EI_DEPRECATED_ATTR; char* erl_iolist_to_string(const ETERM* term) EI_DEPRECATED_ATTR; int erl_iolist_length(const ETERM*) EI_DEPRECATED_ATTR; int erl_length(const ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_mk_atom(const char*) EI_DEPRECATED_ATTR; ETERM *erl_mk_binary(const char*,int) EI_DEPRECATED_ATTR; ETERM *erl_mk_empty_list(void) EI_DEPRECATED_ATTR; ETERM *erl_mk_estring(const char*, int) EI_DEPRECATED_ATTR; ETERM *erl_mk_float(double) EI_DEPRECATED_ATTR; ETERM *erl_mk_int(int) EI_DEPRECATED_ATTR; ETERM *erl_mk_longlong(long long) EI_DEPRECATED_ATTR; ETERM *erl_mk_list(ETERM**,int) EI_DEPRECATED_ATTR; ETERM *erl_mk_pid(const char*,unsigned int,unsigned int,unsigned char) EI_DEPRECATED_ATTR; ETERM *erl_mk_port(const char*,unsigned int,unsigned char) EI_DEPRECATED_ATTR; ETERM *erl_mk_ref(const char*,unsigned int,unsigned char) EI_DEPRECATED_ATTR; ETERM *erl_mk_long_ref(const char*,unsigned int,unsigned int, unsigned int,unsigned char) EI_DEPRECATED_ATTR; ETERM *erl_mk_string(const char*) EI_DEPRECATED_ATTR; ETERM *erl_mk_tuple(ETERM**,int) EI_DEPRECATED_ATTR; ETERM *erl_mk_uint(unsigned int) EI_DEPRECATED_ATTR; ETERM *erl_mk_ulonglong(unsigned long long) EI_DEPRECATED_ATTR; ETERM *erl_mk_var(const char*) EI_DEPRECATED_ATTR; int erl_print_term(FILE*,const ETERM*) EI_DEPRECATED_ATTR; /* int erl_sprint_term(char*,const ETERM*) EI_DEPRECATED_ATTR; */ int erl_size(const ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_tl(const ETERM*) EI_DEPRECATED_ATTR; ETERM *erl_var_content(const ETERM*, const char*) EI_DEPRECATED_ATTR; ETERM *erl_format(char*, ... ) EI_DEPRECATED_ATTR; int erl_match(ETERM*, ETERM*) EI_DEPRECATED_ATTR; char **erl_global_names(int fd, int *count) EI_DEPRECATED_ATTR; int erl_global_register(int fd, const char *name, ETERM *pid) EI_DEPRECATED_ATTR; int erl_global_unregister(int fd, const char *name) EI_DEPRECATED_ATTR; ETERM *erl_global_whereis(int fd, const char *name, char *node) EI_DEPRECATED_ATTR; void erl_init_malloc(Erl_Heap*,long) EI_DEPRECATED_ATTR; ETERM *erl_alloc_eterm(unsigned char) EI_DEPRECATED_ATTR; void erl_eterm_release(void) EI_DEPRECATED_ATTR; void erl_eterm_statistics(unsigned long*,unsigned long*) EI_DEPRECATED_ATTR; void erl_free_array(ETERM**,int) EI_DEPRECATED_ATTR; void erl_free_term(ETERM*) EI_DEPRECATED_ATTR; void erl_free_compound(ETERM*) EI_DEPRECATED_ATTR; void *erl_malloc(long) EI_DEPRECATED_ATTR; void erl_free(void*) EI_DEPRECATED_ATTR; int erl_compare_ext(unsigned char*, unsigned char*) EI_DEPRECATED_ATTR; ETERM *erl_decode(unsigned char*) EI_DEPRECATED_ATTR; ETERM *erl_decode_buf(unsigned char**) EI_DEPRECATED_ATTR; int erl_encode(ETERM*,unsigned char*t) EI_DEPRECATED_ATTR; int erl_encode_buf(ETERM*,unsigned char**) EI_DEPRECATED_ATTR; int erl_ext_size(unsigned char*) EI_DEPRECATED_ATTR; unsigned char erl_ext_type(unsigned char*) EI_DEPRECATED_ATTR; /* Note: returned 'char' before R9C */ unsigned char *erl_peek_ext(unsigned char*,int) EI_DEPRECATED_ATTR; int erl_term_len(ETERM*) EI_DEPRECATED_ATTR; int cmp_latin1_vs_utf8(const char* sL, int lenL, const char* sU, int lenU) EI_DEPRECATED_ATTR; /* -------------------------------------------------------------------- */ /* Wrappers around ei functions */ /* -------------------------------------------------------------------- */ /* * Undocumented before R9C, included for compatibility with old code */ struct hostent *erl_gethostbyname(const char *name) EI_DEPRECATED_ATTR; struct hostent *erl_gethostbyaddr(const char *addr, int len, int type) EI_DEPRECATED_ATTR; struct hostent *erl_gethostbyname_r(const char *name, struct hostent *hostp, char *buffer, int buflen, int *h_errnop) EI_DEPRECATED_ATTR; struct hostent *erl_gethostbyaddr_r(const char *addr, int length, int type, struct hostent *hostp, char *buffer, int buflen, int *h_errnop) EI_DEPRECATED_ATTR; /* * Undocumented, included for compatibility with old code */ void erl_init_resolve(void) EI_DEPRECATED_ATTR; int erl_distversion(int fd) EI_DEPRECATED_ATTR; int erl_epmd_connect(struct in_addr *inaddr) EI_DEPRECATED_ATTR; int erl_epmd_port(struct in_addr *inaddr, const char *alive, int *dist) EI_DEPRECATED_ATTR; #ifdef __cplusplus } #endif #endif