From 95392e693e210189df82173c9bcd345b58b004fe Mon Sep 17 00:00:00 2001 From: Vitaliy Batichko Date: Tue, 23 Nov 2010 18:44:24 +0200 Subject: Add PID (~p) type parameters to ei_format --- lib/erl_interface/doc/src/ei.xml | 1 + lib/erl_interface/src/misc/ei_format.c | 9 +++++++++ lib/erl_interface/test/ei_connect_SUITE.erl | 19 ++++++++++++++++++ .../test/ei_connect_SUITE_data/ei_connect_test.c | 23 +++++++++++++++++++++- 4 files changed, 51 insertions(+), 1 deletion(-) (limited to 'lib/erl_interface') diff --git a/lib/erl_interface/doc/src/ei.xml b/lib/erl_interface/doc/src/ei.xml index be5d7ebef8..de4e4b4301 100644 --- a/lib/erl_interface/doc/src/ei.xml +++ b/lib/erl_interface/doc/src/ei.xml @@ -648,6 +648,7 @@ ei_x_encode_empty_list(&x); ~u - a unsigned long integer, unsigned long int ~f - a float, float ~d - a double float, double float +~p - an Erlang PID, erlang_pid*

For instance, to encode a tuple with some stuff:

diff --git a/lib/erl_interface/src/misc/ei_format.c b/lib/erl_interface/src/misc/ei_format.c
index 96203a0d15..dbd7a4479a 100644
--- a/lib/erl_interface/src/misc/ei_format.c
+++ b/lib/erl_interface/src/misc/ei_format.c
@@ -52,6 +52,7 @@ union arg {
   long l;
   unsigned long u;
   double d;
+  erlang_pid* pid;
 };
 
 static int eiformat(const char** s, union arg** args, ei_x_buff* x);
@@ -232,6 +233,7 @@ static int pquotedatom(const char** fmt, ei_x_buff* x)
   *   u  -  An unsigned long integer
   *   f  -  A float 
   *   d  -  A double float 
+  *   p  -  An Erlang PID
   */
 static int pformat(const char** fmt, union arg** args, ei_x_buff* x)
 {
@@ -267,6 +269,10 @@ static int pformat(const char** fmt, union arg** args, ei_x_buff* x)
 	res = ei_x_encode_double(x, (*args)->d);
 	(*args)++;
 	break;	
+    case 'p':
+	res = ei_x_encode_pid(x, (*args)->pid);
+	(*args)++;
+	break;
     default:
 	res = -1;
 	break;
@@ -424,6 +430,9 @@ static int read_args(const char* fmt, va_list ap, union arg **argp)
 	case 'd':
 	  args[i++].d = va_arg(ap, double);
 	  break;	
+	case 'p':
+	  args[i++].pid = va_arg(ap, erlang_pid*);
+	  break;
 	default:
 	  ei_free(args);	/* Invalid specifier */
 	  return -1;
diff --git a/lib/erl_interface/test/ei_connect_SUITE.erl b/lib/erl_interface/test/ei_connect_SUITE.erl
index fe82a73ef9..3c72188e16 100644
--- a/lib/erl_interface/test/ei_connect_SUITE.erl
+++ b/lib/erl_interface/test/ei_connect_SUITE.erl
@@ -30,6 +30,7 @@
 
 	ei_send/1, 
 	ei_reg_send/1, 
+	ei_format_pid/1,
 	ei_rpc/1, 
 	rpc_test/1, 
 	ei_send_funs/1,
@@ -41,6 +42,7 @@
 
 all(suite) -> [ ei_send, 
 		ei_reg_send, 
+		ei_format_pid,
 		ei_rpc, 
 		ei_send_funs, 
 		ei_threaded_send,
@@ -67,6 +69,19 @@ ei_send(Config) when is_list(Config) ->
     ?line runner:recv_eot(P),
     ok.
 
+ei_format_pid(Config) when is_list(Config) ->
+    ?line S = self(),
+    ?line P = runner:start(?interpret),
+    ?line 0 = ei_connect_init(P, 42, erlang:get_cookie(), 0),
+    ?line {ok,Fd} = ei_connect(P, node()),
+
+    ?line ok = ei_format_pid(P, Fd, S),
+    ?line receive S -> ok end,
+
+    ?line runner:send_eot(P),
+    ?line runner:recv_eot(P),
+    ok.
+
 ei_send_funs(Config) when is_list(Config) ->
     ?line P = runner:start(?interpret),
     ?line 0 = ei_connect_init(P, 42, erlang:get_cookie(), 0),
@@ -189,6 +204,10 @@ ei_send(P, Fd, To, Msg) ->
     send_command(P, ei_send, [Fd,To,Msg]),
     get_send_result(P).
 
+ei_format_pid(P, Fd, To) ->
+    send_command(P, ei_format_pid, [Fd, To]),
+    get_send_result(P).
+
 ei_send_funs(P, Fd, To, Msg) ->
     send_command(P, ei_send_funs, [Fd,To,Msg]),
     get_send_result(P).
diff --git a/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c b/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
index debd3e789b..8183ac9dd8 100644
--- a/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
+++ b/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
@@ -35,6 +35,7 @@
 static void cmd_ei_connect_init(char* buf, int len);
 static void cmd_ei_connect(char* buf, int len);
 static void cmd_ei_send(char* buf, int len);
+static void cmd_ei_format_pid(char* buf, int len);
 static void cmd_ei_send_funs(char* buf, int len);
 static void cmd_ei_reg_send(char* buf, int len);
 static void cmd_ei_rpc(char* buf, int len);
@@ -57,6 +58,7 @@ static struct {
     "ei_reg_send", 	     3, cmd_ei_reg_send,
     "ei_rpc",  		     4, cmd_ei_rpc,
     "ei_set_get_tracelevel", 1, cmd_ei_set_get_tracelevel,
+    "ei_format_pid",         2, cmd_ei_format_pid,
 };
 
 
@@ -111,7 +113,7 @@ static void cmd_ei_connect_init(char* buf, int len)
     ei_x_buff res;
     if (ei_decode_long(buf, &index, &l) < 0)
 	fail("expected int");
-    sprintf(b, "c%d", l);
+    sprintf(b, "c%ld", l);
     /* FIXME don't use internal and maybe use skip?! */
     ei_get_type_internal(buf, &index, &type, &size);
     if (ei_decode_atom(buf, &index, cookie) < 0)
@@ -183,6 +185,25 @@ static void cmd_ei_send(char* buf, int len)
     ei_x_free(&x);
 }
 
+static void cmd_ei_format_pid(char* buf, int len)
+{
+    int index = 0;
+    long fd;
+    erlang_pid pid;
+    ei_x_buff x;
+
+    if (ei_decode_long(buf, &index, &fd) < 0)
+	fail("expected long");
+    if (ei_decode_pid(buf, &index, &pid) < 0)
+	fail("expected pid (node)");
+    if (ei_x_new_with_version(&x) < 0)
+	fail("ei_x_new_with_version");
+    if (ei_x_format_wo_ver(&x, "~p", &pid) < 0)
+	fail("ei_x_format_wo_ver");
+    send_errno_result(ei_send(fd, &pid, x.buff, x.index));
+    ei_x_free(&x);
+}
+
 static void cmd_ei_send_funs(char* buf, int len)
 {
     int index = 0, n;
-- 
cgit v1.2.3