1ei(3) C Library Functions ei(3)
2
3
4
6 ei - Routines for handling the Erlang binary term format.
7
9 The library ei contains macros and functions to encode and decode the
10 Erlang binary term format.
11
12 ei allows you to convert atoms, lists, numbers, and binaries to and
13 from the binary format. This is useful when writing port programs and
14 drivers. ei uses a given buffer, no dynamic memory (except
15 ei_decode_fun()) and is often quite fast.
16
17 ei also handles C-nodes, C-programs that talks Erlang distribution with
18 Erlang nodes (or other C-nodes) using the Erlang distribution format.
19 The difference between ei and erl_interface is that ei uses the binary
20 format directly when sending and receiving terms. It is also thread
21 safe, and using threads, one process can handle multiple C-nodes. The
22 erl_interface library is built on top of ei, but of legacy reasons, it
23 does not allow for multiple C-nodes. In general, ei is the preferred
24 way of doing C-nodes.
25
26 The decode and encode functions use a buffer and an index into the buf‐
27 fer, which points at the point where to encode and decode. The index is
28 updated to point right after the term encoded/decoded. No checking is
29 done whether the term fits in the buffer or not. If encoding goes out‐
30 side the buffer, the program can crash.
31
32 All functions take two parameters:
33
34 * buf is a pointer to the buffer where the binary data is or will be.
35
36 * index is a pointer to an index into the buffer. This parameter is
37 incremented with the size of the term decoded/encoded.
38
39 The data is thus at buf[*index] when an ei function is called.
40
41 All encode functions assume that the buf and index parameters point to
42 a buffer large enough for the data. To get the size of an encoded term,
43 without encoding it, pass NULL instead of a buffer pointer. Parameter
44 index is incremented, but nothing will be encoded. This is the way in
45 ei to "preflight" term encoding.
46
47 There are also encode functions that use a dynamic buffer. It is often
48 more convenient to use these to encode data. All encode functions comes
49 in two versions; those starting with ei_x use a dynamic buffer.
50
51 All functions return 0 if successful, otherwise -1 (for example, if a
52 term is not of the expected type, or the data to decode is an invalid
53 Erlang term).
54
55 Some of the decode functions need a pre-allocated buffer. This buffer
56 must be allocated large enough, and for non-compound types the
57 ei_get_type() function returns the size required (notice that for
58 strings an extra byte is needed for the NULL-terminator).
59
61 erlang_char_encoding:
62
63
64 typedef enum {
65 ERLANG_ASCII = 1,
66 ERLANG_LATIN1 = 2,
67 ERLANG_UTF8 = 4
68 } erlang_char_encoding;
69
70 The character encodings used for atoms. ERLANG_ASCII represents
71 7-bit ASCII. Latin-1 and UTF-8 are different extensions of 7-bit
72 ASCII. All 7-bit ASCII characters are valid Latin-1 and UTF-8 char‐
73 acters. ASCII and Latin-1 both represent each character by one
74 byte. An UTF-8 character can consist of 1-4 bytes. Notice that
75 these constants are bit-flags and can be combined with bitwise OR.
76
78 int ei_decode_atom(const char *buf, int *index, char *p)
79
80 Decodes an atom from the binary format. The NULL-terminated name
81 of the atom is placed at p. At most MAXATOMLEN bytes can be
82 placed in the buffer.
83
84 int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
85 erlang_char_encoding want, erlang_char_encoding* was,
86 erlang_char_encoding* result)
87
88 Decodes an atom from the binary format. The NULL-terminated name
89 of the atom is placed in buffer at p of length plen bytes.
90
91 The wanted string encoding is specified by want. The original
92 encoding used in the binary format (Latin-1 or UTF-8) can be
93 obtained from *was. The encoding of the resulting string (7-bit
94 ASCII, Latin-1, or UTF-8) can be obtained from *result. Both was
95 and result can be NULL. *result can differ from want if want is
96 a bitwise OR'd combination like ERLANG_LATIN1|ERLANG_UTF8 or if
97 *result turns out to be pure 7-bit ASCII (compatible with both
98 Latin-1 and UTF-8).
99
100 This function fails if the atom is too long for the buffer or if
101 it cannot be represented with encoding want.
102
103 This function was introduced in Erlang/OTP R16 as part of a
104 first step to support UTF-8 atoms.
105
106 int ei_decode_bignum(const char *buf, int *index, mpz_t obj)
107
108 Decodes an integer in the binary format to a GMP mpz_t integer.
109 To use this function, the ei library must be configured and com‐
110 piled to use the GMP library.
111
112 int ei_decode_binary(const char *buf, int *index, void *p, long *len)
113
114 Decodes a binary from the binary format. Parameter len is set to
115 the actual size of the binary. Notice that ei_decode_binary()
116 assumes that there is enough room for the binary. The size
117 required can be fetched by ei_get_type().
118
119 int ei_decode_boolean(const char *buf, int *index, int *p)
120
121 Decodes a boolean value from the binary format. A boolean is
122 actually an atom, true decodes 1 and false decodes 0.
123
124 int ei_decode_char(const char *buf, int *index, char *p)
125
126 Decodes a char (8-bit) integer between 0-255 from the binary
127 format. For historical reasons the returned integer is of type
128 char. Your C code is to consider the returned value to be of
129 type unsigned char even if the C compilers and system can define
130 char to be signed.
131
132 int ei_decode_double(const char *buf, int *index, double *p)
133
134 Decodes a double-precision (64-bit) floating point number from
135 the binary format.
136
137 int ei_decode_ei_term(const char* buf, int* index, ei_term* term)
138
139 Decodes any term, or at least tries to. If the term pointed at
140 by *index in buf fits in the term union, it is decoded, and the
141 appropriate field in term->value is set, and *index is incre‐
142 mented by the term size.
143
144 The function returns 1 on successful decoding, -1 on error, and
145 0 if the term seems alright, but does not fit in the term struc‐
146 ture. If 1 is returned, the index is incremented, and term con‐
147 tains the decoded term.
148
149 The term structure contains the arity for a tuple or list, size
150 for a binary, string, or atom. It contains a term if it is any
151 of the following: integer, float, atom, pid, port, or ref.
152
153 int ei_decode_fun(const char *buf, int *index, erlang_fun *p)
154 void free_fun(erlang_fun* f)
155
156 Decodes a fun from the binary format. Parameter p is to be NULL
157 or point to an erlang_fun structure. This is the only decode
158 function that allocates memory. When the erlang_fun is no longer
159 needed, it is to be freed with free_fun. (This has to do with
160 the arbitrary size of the environment for a fun.)
161
162 int ei_decode_list_header(const char *buf, int *index, int *arity)
163
164 Decodes a list header from the binary format. The number of ele‐
165 ments is returned in arity. The arity+1 elements follow (the
166 last one is the tail of the list, normally an empty list). If
167 arity is 0, it is an empty list.
168
169 Notice that lists are encoded as strings if they consist
170 entirely of integers in the range 0..255. This function do not
171 decode such strings, use ei_decode_string() instead.
172
173 int ei_decode_long(const char *buf, int *index, long *p)
174
175 Decodes a long integer from the binary format. If the code is 64
176 bits, the function ei_decode_long() is the same as
177 ei_decode_longlong().
178
179 int ei_decode_longlong(const char *buf, int *index, long long *p)
180
181 Decodes a GCC long long or Visual C++ __int64 (64-bit) integer
182 from the binary format. This function is missing in the VxWorks
183 port.
184
185 int ei_decode_map_header(const char *buf, int *index, int *arity)
186
187 Decodes a map header from the binary format. The number of key-
188 value pairs is returned in *arity. Keys and values follow in
189 this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of
190 arity*2 terms. If arity is zero, it is an empty map. A correctly
191 encoded map does not have duplicate keys.
192
193 int ei_decode_pid(const char *buf, int *index, erlang_pid *p)
194
195 Decodes a process identifier (pid) from the binary format.
196
197 int ei_decode_port(const char *buf, int *index, erlang_port *p)
198
199 Decodes a port identifier from the binary format.
200
201 int ei_decode_ref(const char *buf, int *index, erlang_ref *p)
202
203 Decodes a reference from the binary format.
204
205 int ei_decode_string(const char *buf, int *index, char *p)
206
207 Decodes a string from the binary format. A string in Erlang is a
208 list of integers between 0 and 255. Notice that as the string is
209 just a list, sometimes lists are encoded as strings by
210 term_to_binary/1, even if it was not intended.
211
212 The string is copied to p, and enough space must be allocated.
213 The returned string is NULL-terminated, so you must add an extra
214 byte to the memory requirement.
215
216 int ei_decode_term(const char *buf, int *index, void *t)
217
218 Decodes a term from the binary format. The term is return in t
219 as a ETERM*, so t is actually an ETERM** (see erl_eterm). The
220 term is later to be deallocated.
221
222 Notice that this function is located in the Erl_Interface
223 library.
224
225 int ei_decode_trace(const char *buf, int *index, erlang_trace *p)
226
227 Decodes an Erlang trace token from the binary format.
228
229 int ei_decode_tuple_header(const char *buf, int *index, int *arity)
230
231 Decodes a tuple header, the number of elements is returned in
232 arity. The tuple elements follow in order in the buffer.
233
234 int ei_decode_ulong(const char *buf, int *index, unsigned long *p)
235
236 Decodes an unsigned long integer from the binary format. If the
237 code is 64 bits, the function ei_decode_ulong() is the same as
238 ei_decode_ulonglong().
239
240 int ei_decode_ulonglong(const char *buf, int *index, unsigned long long
241 *p)
242
243 Decodes a GCC unsigned long long or Visual C++ unsigned __int64
244 (64-bit) integer from the binary format. This function is miss‐
245 ing in the VxWorks port.
246
247 int ei_decode_version(const char *buf, int *index, int *version)
248
249 Decodes the version magic number for the Erlang binary term for‐
250 mat. It must be the first token in a binary term.
251
252 int ei_encode_atom(char *buf, int *index, const char *p)
253 int ei_encode_atom_len(char *buf, int *index, const char *p, int len)
254 int ei_x_encode_atom(ei_x_buff* x, const char *p)
255 int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len)
256
257 Encodes an atom in the binary format. Parameter p is the name of
258 the atom in Latin-1 encoding. Only up to MAXATOMLEN-1 bytes are
259 encoded. The name is to be NULL-terminated, except for the
260 ei_x_encode_atom_len() function.
261
262 int ei_encode_atom_as(char *buf, int *index, const char *p,
263 erlang_char_encoding from_enc, erlang_char_encoding to_enc)
264 int ei_encode_atom_len_as(char *buf, int *index, const char *p, int
265 len, erlang_char_encoding from_enc, erlang_char_encoding to_enc)
266 int ei_x_encode_atom_as(ei_x_buff* x, const char *p, erlang_char_encod‐
267 ing from_enc, erlang_char_encoding to_enc)
268 int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
269 erlang_char_encoding from_enc, erlang_char_encoding to_enc)
270
271 Encodes an atom in the binary format. Parameter p is the name of
272 the atom with character encoding from_enc (ASCII, Latin-1, or
273 UTF-8). The name must either be NULL-terminated or a function
274 variant with a len parameter must be used.
275
276 The encoding fails if p is not a valid string in encoding
277 from_enc.
278
279 Argument to_enc is ignored. As from Erlang/OTP 20 the encoding
280 is always done in UTF-8 which is readable by nodes as old as
281 Erlang/OTP R16.
282
283 int ei_encode_bignum(char *buf, int *index, mpz_t obj)
284 int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj)
285
286 Encodes a GMP mpz_t integer to binary format. To use this func‐
287 tion, the ei library must be configured and compiled to use the
288 GMP library.
289
290 int ei_encode_binary(char *buf, int *index, const void *p, long len)
291 int ei_x_encode_binary(ei_x_buff* x, const void *p, long len)
292
293 Encodes a binary in the binary format. The data is at p, of len
294 bytes length.
295
296 int ei_encode_boolean(char *buf, int *index, int p)
297 int ei_x_encode_boolean(ei_x_buff* x, int p)
298
299 Encodes a boolean value as the atom true if p is not zero, or
300 false if p is zero.
301
302 int ei_encode_char(char *buf, int *index, char p)
303 int ei_x_encode_char(ei_x_buff* x, char p)
304
305 Encodes a char (8-bit) as an integer between 0-255 in the binary
306 format. For historical reasons the integer argument is of type
307 char. Your C code is to consider the specified argument to be of
308 type unsigned char even if the C compilers and system may define
309 char to be signed.
310
311 int ei_encode_double(char *buf, int *index, double p)
312 int ei_x_encode_double(ei_x_buff* x, double p)
313
314 Encodes a double-precision (64-bit) floating point number in the
315 binary format.
316
317 Returns -1 if the floating point number is not finite.
318
319 int ei_encode_empty_list(char* buf, int* index)
320 int ei_x_encode_empty_list(ei_x_buff* x)
321
322 Encodes an empty list. It is often used at the tail of a list.
323
324 int ei_encode_fun(char *buf, int *index, const erlang_fun *p)
325 int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun)
326
327 Encodes a fun in the binary format. Parameter p points to an
328 erlang_fun structure. The erlang_fun is not freed automatically,
329 the free_fun is to be called if the fun is not needed after
330 encoding.
331
332 int ei_encode_list_header(char *buf, int *index, int arity)
333 int ei_x_encode_list_header(ei_x_buff* x, int arity)
334
335 Encodes a list header, with a specified arity. The next arity+1
336 terms are the elements (actually its arity cons cells) and the
337 tail of the list. Lists and tuples are encoded recursively, so
338 that a list can contain another list or tuple.
339
340 For example, to encode the list [c, d, [e | f]]:
341
342 ei_encode_list_header(buf, &i, 3);
343 ei_encode_atom(buf, &i, "c");
344 ei_encode_atom(buf, &i, "d");
345 ei_encode_list_header(buf, &i, 1);
346 ei_encode_atom(buf, &i, "e");
347 ei_encode_atom(buf, &i, "f");
348 ei_encode_empty_list(buf, &i);
349
350 Note:
351 It may seem that there is no way to create a list without know‐
352 ing the number of elements in advance. But indeed there is a
353 way. Notice that the list [a, b, c] can be written as [a | [b |
354 [c]]]. Using this, a list can be written as conses.
355
356
357 To encode a list, without knowing the arity in advance:
358
359 while (something()) {
360 ei_x_encode_list_header(&x, 1);
361 ei_x_encode_ulong(&x, i); /* just an example */
362 }
363 ei_x_encode_empty_list(&x);
364
365 int ei_encode_long(char *buf, int *index, long p)
366 int ei_x_encode_long(ei_x_buff* x, long p)
367
368 Encodes a long integer in the binary format. If the code is 64
369 bits, the function ei_encode_long() is the same as
370 ei_encode_longlong().
371
372 int ei_encode_longlong(char *buf, int *index, long long p)
373 int ei_x_encode_longlong(ei_x_buff* x, long long p)
374
375 Encodes a GCC long long or Visual C++ __int64 (64-bit) integer
376 in the binary format. This function is missing in the VxWorks
377 port.
378
379 int ei_encode_map_header(char *buf, int *index, int arity)
380 int ei_x_encode_map_header(ei_x_buff* x, int arity)
381
382 Encodes a map header, with a specified arity. The next arity*2
383 terms encoded will be the keys and values of the map encoded in
384 the following order: K1, V1, K2, V2, ..., Kn, Vn.
385
386 For example, to encode the map #{a => "Apple", b => "Banana"}:
387
388 ei_x_encode_map_header(&x, 2);
389 ei_x_encode_atom(&x, "a");
390 ei_x_encode_string(&x, "Apple");
391 ei_x_encode_atom(&x, "b");
392 ei_x_encode_string(&x, "Banana");
393
394 A correctly encoded map cannot have duplicate keys.
395
396 int ei_encode_pid(char *buf, int *index, const erlang_pid *p)
397 int ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p)
398
399 Encodes an Erlang process identifier (pid) in the binary format.
400 Parameter p points to an erlang_pid structure (which should have
401 been obtained earlier with ei_decode_pid()).
402
403 int ei_encode_port(char *buf, int *index, const erlang_port *p)
404 int ei_x_encode_port(ei_x_buff* x, const erlang_port *p)
405
406 Encodes an Erlang port in the binary format. Parameter p points
407 to a erlang_port structure (which should have been obtained ear‐
408 lier with ei_decode_port()).
409
410 int ei_encode_ref(char *buf, int *index, const erlang_ref *p)
411 int ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p)
412
413 Encodes an Erlang reference in the binary format. Parameter p
414 points to a erlang_ref structure (which should have been
415 obtained earlier with ei_decode_ref()).
416
417 int ei_encode_string(char *buf, int *index, const char *p)
418 int ei_encode_string_len(char *buf, int *index, const char *p, int len)
419 int ei_x_encode_string(ei_x_buff* x, const char *p)
420 int ei_x_encode_string_len(ei_x_buff* x, const char* s, int len)
421
422 Encodes a string in the binary format. (A string in Erlang is a
423 list, but is encoded as a character array in the binary format.)
424 The string is to be NULL-terminated, except for the
425 ei_x_encode_string_len() function.
426
427 int ei_encode_term(char *buf, int *index, void *t)
428 int ei_x_encode_term(ei_x_buff* x, void *t)
429
430 Encodes an ETERM, as obtained from erl_interface. Parameter t is
431 actually an ETERM pointer. This function does not free the
432 ETERM.
433
434 int ei_encode_trace(char *buf, int *index, const erlang_trace *p)
435 int ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p)
436
437 Encodes an Erlang trace token in the binary format. Parameter p
438 points to a erlang_trace structure (which should have been
439 obtained earlier with ei_decode_trace()).
440
441 int ei_encode_tuple_header(char *buf, int *index, int arity)
442 int ei_x_encode_tuple_header(ei_x_buff* x, int arity)
443
444 Encodes a tuple header, with a specified arity. The next arity
445 terms encoded will be the elements of the tuple. Tuples and
446 lists are encoded recursively, so that a tuple can contain
447 another tuple or list.
448
449 For example, to encode the tuple {a, {b, {}}}:
450
451 ei_encode_tuple_header(buf, &i, 2);
452 ei_encode_atom(buf, &i, "a");
453 ei_encode_tuple_header(buf, &i, 2);
454 ei_encode_atom(buf, &i, "b");
455 ei_encode_tuple_header(buf, &i, 0);
456
457 int ei_encode_ulong(char *buf, int *index, unsigned long p)
458 int ei_x_encode_ulong(ei_x_buff* x, unsigned long p)
459
460 Encodes an unsigned long integer in the binary format. If the
461 code is 64 bits, the function ei_encode_ulong() is the same as
462 ei_encode_ulonglong().
463
464 int ei_encode_ulonglong(char *buf, int *index, unsigned long long p)
465 int ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p)
466
467 Encodes a GCC unsigned long long or Visual C++ unsigned __int64
468 (64-bit) integer in the binary format. This function is missing
469 in the VxWorks port.
470
471 int ei_encode_version(char *buf, int *index)
472 int ei_x_encode_version(ei_x_buff* x)
473
474 Encodes a version magic number for the binary format. Must be
475 the first token in a binary term.
476
477 int ei_get_type(const char *buf, const int *index, int *type, int
478 *size)
479
480 Returns the type in type and size in size of the encoded term.
481 For strings and atoms, size is the number of characters not
482 including the terminating NULL. For binaries, size is the number
483 of bytes. For lists and tuples, size is the arity of the object.
484 For other types, size is 0. In all cases, index is left
485 unchanged.
486
487 int ei_init(void)
488
489 Initialize the ei library. This function should be called once
490 (and only once) before calling any other functionality in the ei
491 library. However, note the exception below.
492
493 If the ei library is used together with the erl_interface
494 library, this function should not be called directly. It will be
495 called by the erl_init() function which should be used to ini‐
496 tialize the combination of the two libraries instead.
497
498 On success zero is returned. On failure a posix error code is
499 returned.
500
501 int ei_print_term(FILE* fp, const char* buf, int* index)
502 int ei_s_print_term(char** s, const char* buf, int* index)
503
504 Prints a term, in clear text, to the file specified by fp, or
505 the buffer pointed to by s. It tries to resemble the term print‐
506 ing in the Erlang shell.
507
508 In ei_s_print_term(), parameter s is to point to a dynamically
509 (malloc) allocated string of BUFSIZ bytes or a NULL pointer. The
510 string can be reallocated (and *s can be updated) by this func‐
511 tion if the result is more than BUFSIZ characters. The string
512 returned is NULL-terminated.
513
514 The return value is the number of characters written to the file
515 or string, or -1 if buf[index] does not contain a valid term.
516 Unfortunately, I/O errors on fp is not checked.
517
518 Argument index is updated, that is, this function can be viewed
519 as a decode function that decodes a term into a human-readable
520 format.
521
522 void ei_set_compat_rel(release_number)
523
524 Types:
525
526 unsigned release_number;
527
528 By default, the ei library is only guaranteed to be compatible
529 with other Erlang/OTP components from the same release as the ei
530 library itself. For example, ei from Erlang/OTP R10 is not com‐
531 patible with an Erlang emulator from Erlang/OTP R9 by default.
532
533 A call to ei_set_compat_rel(release_number) sets the ei library
534 in compatibility mode of release release_number. Valid range of
535 release_number is [7, current release]. This makes it possible
536 to communicate with Erlang/OTP components from earlier releases.
537
538 Note:
539 If this function is called, it can only be called once and must
540 be called before any other functions in the ei library are
541 called.
542
543
544 Warning:
545 You can run into trouble if this feature is used carelessly.
546 Always ensure that all communicating components are either from
547 the same Erlang/OTP release, or from release X and release Y
548 where all components from release Y are in compatibility mode of
549 release X.
550
551
552 int ei_skip_term(const char* buf, int* index)
553
554 Skips a term in the specified buffer; recursively skips elements
555 of lists and tuples, so that a full term is skipped. This is a
556 way to get the size of an Erlang term.
557
558 buf is the buffer.
559
560 index is updated to point right after the term in the buffer.
561
562 Note:
563 This can be useful when you want to hold arbitrary terms: skip
564 them and copy the binary term data to some buffer.
565
566
567 Returns 0 on success, otherwise -1.
568
569 int ei_x_append(ei_x_buff* x, const ei_x_buff* x2)
570 int ei_x_append_buf(ei_x_buff* x, const char* buf, int len)
571
572 Appends data at the end of buffer x.
573
574 int ei_x_format(ei_x_buff* x, const char* fmt, ...)
575 int ei_x_format_wo_ver(ei_x_buff* x, const char *fmt, ... )
576
577 Formats a term, given as a string, to a buffer. Works like a
578 sprintf for Erlang terms. fmt contains a format string, with
579 arguments like ~d, to insert terms from variables. The following
580 formats are supported (with the C types given):
581
582 ~a An atom, char*
583 ~c A character, char
584 ~s A string, char*
585 ~i An integer, int
586 ~l A long integer, long int
587 ~u A unsigned long integer, unsigned long int
588 ~f A float, float
589 ~d A double float, double float
590 ~p An Erlang pid, erlang_pid*
591
592 For example, to encode a tuple with some stuff:
593
594 ei_x_format("{~a,~i,~d}", "numbers", 12, 3.14159)
595 encodes the tuple {numbers,12,3.14159}
596
597 ei_x_format_wo_ver() formats into a buffer, without the initial
598 version byte.
599
600 int ei_x_free(ei_x_buff* x)
601
602 Frees an ei_x_buff buffer. The memory used by the buffer is
603 returned to the OS.
604
605 int ei_x_new(ei_x_buff* x)
606 int ei_x_new_with_version(ei_x_buff* x)
607
608 Allocates a new ei_x_buff buffer. The fields of the structure
609 pointed to by parameter x is filled in, and a default buffer is
610 allocated. ei_x_new_with_version() also puts an initial version
611 byte, which is used in the binary format (so that
612 ei_x_encode_version() will not be needed.)
613
615 Some tips on what to check when the emulator does not seem to receive
616 the terms that you send:
617
618 * Be careful with the version header, use ei_x_new_with_version()
619 when appropriate.
620
621 * Turn on distribution tracing on the Erlang node.
622
623 * Check the result codes from ei_decode_-calls.
624
626 erl_eterm
627
628
629
630Ericsson AB erl_interface 3.11.3 ei(3)