You can subscribe to this list here.
2003 |
Jan
|
Feb
(27) |
Mar
(132) |
Apr
(63) |
May
(100) |
Jun
(22) |
Jul
(7) |
Aug
(3) |
Sep
(14) |
Oct
(24) |
Nov
(49) |
Dec
(17) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(13) |
Feb
(43) |
Mar
(67) |
Apr
(21) |
May
(24) |
Jun
(3) |
Jul
(15) |
Aug
|
Sep
(1) |
Oct
(40) |
Nov
(2) |
Dec
(94) |
2005 |
Jan
(5) |
Feb
(36) |
Mar
(10) |
Apr
(8) |
May
(35) |
Jun
(13) |
Jul
(55) |
Aug
(82) |
Sep
(59) |
Oct
(20) |
Nov
(55) |
Dec
(15) |
2006 |
Jan
(40) |
Feb
(25) |
Mar
(42) |
Apr
(1) |
May
(12) |
Jun
(3) |
Jul
(2) |
Aug
(23) |
Sep
(33) |
Oct
(4) |
Nov
(5) |
Dec
(22) |
2007 |
Jan
(10) |
Feb
|
Mar
(4) |
Apr
(3) |
May
(8) |
Jun
(4) |
Jul
|
Aug
(3) |
Sep
(12) |
Oct
(9) |
Nov
(1) |
Dec
|
2008 |
Jan
|
Feb
(5) |
Mar
(4) |
Apr
|
May
(4) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(7) |
Nov
|
Dec
|
2009 |
Jan
(8) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(11) |
Aug
|
Sep
(3) |
Oct
|
Nov
|
Dec
|
2011 |
Jan
(7) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <cpr...@us...> - 2003-03-01 09:51:04
|
Update of /cvsroot/jungerl/jungerl/lib/pan In directory sc8-pr-cvs1:/tmp/cvs-serv6233/lib/pan Modified Files: Makefile Log Message: Further Jungerl'ified pan. Index: Makefile =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/pan/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Makefile 1 Mar 2003 06:09:08 -0000 1.3 +++ Makefile 1 Mar 2003 09:51:01 -0000 1.4 @@ -1,6 +1,6 @@ include ../../support/include.mk -EFLAGS = -W +debug_info + ERLS = $(shell echo src/*.erl) BEAMS = $(patsubst src/%.erl, ebin/%.beam, $(ERLS)) @@ -8,7 +8,7 @@ ebin/%.beam: src/%.erl - $(ERLC) -o ebin -I inc $(EFLAGS) $< + $(ERLC) -o ebin -I inc $(ERLC_FLAGS) $< default: all all: $(BEAMS) |
From: <cpr...@us...> - 2003-03-01 09:20:57
|
Update of /cvsroot/jungerl/jungerl/lib/ce/src In directory sc8-pr-cvs1:/tmp/cvs-serv24657 Added Files: ce_smtp.erl ce_telnet.erl Log Message: Added ce_smtp and ce_telnet. --- NEW FILE: ce_smtp.erl --- %%% BEGIN ce_smtp.erl %%% %%% %%% ce_smtp - RFC 821 SMTP client in Erlang %%% Copyright (c)2003 Cat's Eye Technologies. All rights reserved. %%% %%% Redistribution and use in source and binary forms, with or without %%% modification, are permitted provided that the following conditions %%% are met: %%% %%% Redistributions of source code must retain the above copyright %%% notice, this list of conditions and the following disclaimer. %%% %%% Redistributions in binary form must reproduce the above copyright %%% notice, this list of conditions and the following disclaimer in %%% the documentation and/or other materials provided with the %%% distribution. %%% %%% Neither the name of Cat's Eye Technologies nor the names of its %%% contributors may be used to endorse or promote products derived %%% from this software without specific prior written permission. %%% %%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND %%% CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, %%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF %%% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE %%% DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE %%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, %%% OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, %%% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, %%% OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON %%% ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, %%% OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY %%% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE %%% POSSIBILITY OF SUCH DAMAGE. %% @doc Simple SMTP client in Erlang. %% %% <p>This SMTP client is very simple, but is capable of sending e-mail %% via a standard SMTP server. If something unexpected happens, the %% entire e-mail transaction is aborted.</p> %% %% <p>This module was previously called <code>smtpe</code>.</p> %% %% @end -module(ce_smtp). -vsn('JUNGERL'). -author('ca...@ca...'). -copyright('Copyright (c)2003 Cat`s Eye Technologies. All rights reserved.'). -include_lib("kernel/include/inet.hrl"). -export([send_email/1, client/9]). %% @spec send_email([option()]) -> ok | {error, Reason} %% option() = {atom(), term()} %% @doc Sends an e-mail message to an SMTP server. Options include: %% <ul> %% <li> <code>{host, string()}</code> %% <p> the name of the host that the SMTP server is running on.</p></li> %% <li> <code>{port, string()}</code> %% <p> the port on the host that is running the SMTP service, if not 25.</p></li> %% <li> <code>{originator, string()}</code> %% <p> the name of the host that is originating the transaction (i.e., %% this host.)</p></li> %% <li> <code>{sender, string()}</code> %% <p> the e-mail address of the message sender.</p></li> %% <li> <code>{recipients, [string()]}</code> %% <p> the e-mail addresses of the message recipients.</p></li> %% <li> <code>{subject, string()}</code> %% <p> the subject of the message.</p></li> %% <li> <code>{headers, [string()]}</code> %% <p> custom e-mail headers in the form <code>"Header: value"</code>, %% one header per string.</p></li> %% <li> <code>{message, [string()]}</code> %% <p> the body of the e-mail message to send, one line per string.</p></li> %% </ul> send_email(Options) -> (catch application:load(?MODULE)), EnvHost = ce_lib:to_string(os:getenv("HOST")), EnvUser = ce_lib:to_string(os:getenv("USER")), Host = get_opt(Options, host, EnvHost), % get host's ip address case inet:gethostbyname(Host) of {ok, #hostent{ h_addr_list = [HeadIP | Tail] }} -> send_email0(HeadIP, Host, Options, EnvHost, EnvUser); _ -> {error, host_not_found} end. send_email0(HostIP, Host, Options, EnvHost, EnvUser) -> log("host: ~p ~p", [Host, HostIP]), Port = get_opt(Options, port, 25), EnvSender = EnvUser ++ "@" ++ EnvHost, Originator = get_opt(Options, originator, EnvHost), Sender = get_opt(Options, sender, EnvSender), Recipients = get_opt(Options, recipients, [EnvSender]), Message = get_opt(Options, message, ["line one", "line two"]), MessageID = ce_calendar:timestamp() ++ ".ce_smtp@" ++ EnvHost, Subject = get_opt(Options, subject, "(No Subject)"), Headers = get_opt(Options, headers, []), ce_socket:client(?MODULE, client, [self(), Originator, Sender, Recipients, Message, MessageID, Headers, Subject], HostIP, Port, [list, {active, false}, {packet, line}]), receive {?MODULE, client, Result} -> Result end. %% @spec client(socket(), pid(), Originator::string(), Sender::string(), %% Recipients::[string()], Message::string(), MessageID::string(), %% Headers::[string()], Subject::string()) -> exit %% @doc Called by send_email/1. Should not be called directly by user code. client(Socket, Parent, Originator, Sender, Recipients, Message, MessageID, Headers, Subject) -> Result = (catch client0(Socket, Parent, Originator, Sender, Recipients, Message, MessageID, Headers, Subject)), send_line(Socket, "QUIT"), expect(Socket, 221), case Result of {'EXIT', R} -> Parent ! {?MODULE, client, {error, R}}; _ -> Parent ! {?MODULE, client, Result} end, exit(normal). client0(Socket, Parent, Originator, Sender, Recipients, Message, MessageID, Headers, Subject) -> expect(Socket, 220), send_line(Socket, "HELO " ++ Originator), expect(Socket, 250), send_line(Socket, "MAIL FROM:<" ++ Sender ++ ">"), expect(Socket, 250), lists:foreach(fun(Recipient) -> send_line(Socket, "RCPT TO:<" ++ Recipient ++ ">"), expect(Socket, 250) end, Recipients), send_line(Socket, "DATA"), expect(Socket, 354), send_line(Socket, "From: <" ++ Sender ++ ">"), send_line(Socket, "Date: " ++ ce_calendar:rfc_1123_datetime()), send_line(Socket, "Message-Id: <" ++ MessageID ++ ">"), RecipientList = lists:foldl(fun(Recipient, A) -> Recipient0 = "<" ++ Recipient ++ ">", case A of "" -> Recipient0; _ -> A ++ ", " ++ Recipient0 end end, "", Recipients), send_line(Socket, "To: " ++ RecipientList), send_line(Socket, "Subject: " ++ Subject), lists:foreach(fun(Header) -> send_line(Socket, escape(Header)) end, Headers), send_line(Socket, ""), lists:foreach(fun(MessageLine) -> send_line(Socket, escape(MessageLine)) end, Message), send_line(Socket, "."), expect(Socket, 250). get_line(Socket) -> {ok, L} = gen_tcp:recv(Socket, 0), Line = ce_string:chomp(L), log("R:~s", [Line]), Line. %% @spec expect(socket(), integer()) -> ok %% @doc Expects a given return-code from the SMTP server. If it does not %% match what is given, an error is thrown. expect(Socket, Code) -> CodeString = ce_lib:to_string(Code), Line = get_line(Socket), case string:str(Line, CodeString) of 1 -> ok; _ -> throw({'EXIT', {response, Line}}) end. %% @spec send_line(socket(), string()) -> ok %% @doc Sends a line of text to the given socket. send_line(Socket, Line) -> log("S:~s", [Line]), gen_tcp:send(Socket, Line ++ eol()), ok. %% @spec escape(string()) -> string() %% @doc Escapes a line per RFC 821, prepending a period if need be. escape("." ++ RestOfString) -> ".." ++ RestOfString; escape(String) -> String. %% @spec get_opt(Options::[option()], Key::atom(), Default::term()) -> term() %% @doc Gets an SMTP option. If the specified option in present %% in the list, that value is used; if not, the <code>env</code> key of %% <code>ce_smtp.app</code> is checked, and if no value is found there %% the given default is used. get_opt(Options, Key, Default) -> case lists:keysearch(Key, 1, Options) of {value, {Key, P}} -> P; _ -> case application:get_env(?MODULE, Key) of {ok, R} -> R; _ -> Default end end. %% @spec log(string(), [term()]) -> ok %% @doc Logs a string to the terminal. log(Fmt, Args) -> Term = {calendar:local_time(), lists:flatten(io_lib:format(Fmt, Args))}, io:fwrite("~p~n", [Term]), ok. %% @spec eol() -> string() %% @doc Returns the internet line terminator sequence. eol() -> "\r\n". %%% END of ce_smtp.erl %%% --- NEW FILE: ce_telnet.erl --- %%% BEGIN ce_telnet.erl %%% %%% %%% ce_telnet - rudimentary TELNET server in Erlang %%% Copyright (c)2003 Cat's Eye Technologies. All rights reserved. %%% %%% Redistribution and use in source and binary forms, with or without %%% modification, are permitted provided that the following conditions %%% are met: %%% %%% Redistributions of source code must retain the above copyright %%% notice, this list of conditions and the following disclaimer. %%% %%% Redistributions in binary form must reproduce the above copyright %%% notice, this list of conditions and the following disclaimer in %%% the documentation and/or other materials provided with the %%% distribution. %%% %%% Neither the name of Cat's Eye Technologies nor the names of its %%% contributors may be used to endorse or promote products derived %%% from this software without specific prior written permission. %%% %%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND %%% CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, %%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF %%% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE %%% DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE %%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, %%% OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, %%% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, %%% OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON %%% ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, %%% OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY %%% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE %%% POSSIBILITY OF SUCH DAMAGE. %% @doc Rudimentary TELNET server in Erlang. %% %% @end -module(ce_telnet). -vsn('JUNGERL'). -author('ca...@ca...'). -copyright('Copyright (c)2003 Cat`s Eye Technologies. All rights reserved.'). -export([start/4, server/3]). -export([send/2, send_file/2]). -export([get_line/1, get_char/1, get_char/2]). -define(WILL, 251). -define(WONT, 252). -define(DO, 253). -define(DONT, 254). -define(IAC, 255). -define(TRANSMIT_BINARY, 0). -define(ECHO, 1). -define(SUPPRESS_GO_AHEAD, 3). %% @spec start(Module::atom(), Function::atom(), Port::integer(), MaxCon::integer()) -> pid() %% @doc Starts a telnet server on the given port. When a connection is made, %% <code>Module:Function/1</code> is called and passed the pid of the %% telnet server. This function can then use functions like %% <code>send</code> and <code>get_line</code>, and/or it can directly %% receive the following messages: %% <code>{Telnet::pid(), close}</code>, which means the socket was closed %% by the client; and %% <code>{Telnet::pid(), {byte, integer()}}</code>, which means a byte %% was successfully received. start(Module, Function, Port, MaxCon) -> Telnet = ce_socket:server(?MODULE, server, [Module, Function], Port, [list, {active, true}, {nodelay, true}, {reuseaddr, true}, {packet, raw}], MaxCon). %% @spec server(Socket::socket(), Module::atom(), Function::atom()) -> never_returns %% @doc Spawned by <code>start/4</code> to handle the telnet server. server(Socket, Module, Function) -> % io:fwrite("connect ~p~n", [Socket]), gen_tcp:send(Socket, <<?IAC, ?DONT, ?ECHO>>), gen_tcp:send(Socket, <<?IAC, ?DO, ?TRANSMIT_BINARY>>), Pid = spawn_link(Module, Function, [self()]), loop(Socket, Pid, text, []). loop(Socket, Pid, State, Buffer) -> receive {tcp, Socket, Bytes} -> {NewState, NewBuffer} = reduce(Pid, State, Bytes ++ Buffer), loop(Socket, Pid, NewState, NewBuffer); {tcp_closed, Socket} -> % io:fwrite("disconnect ~p~n", [Socket]), Pid ! closed, {error, closed}; {tcp_error, Socket, Reason} -> io:fwrite("error on ~p: ~p~n", [Socket, Reason]), Pid ! {self(), closed}, gen_tcp:close(Socket), {error, {telnet, Reason}}; {output, List} when is_list(List) -> gen_tcp:send(Socket, List), loop(Socket, Pid, State, Buffer); Else -> io:fwrite("Huh? ~p", [Else]), loop(Socket, Pid, State, Buffer) end. reduce(Pid, State, []) -> {State, []}; reduce(Pid, text, [?IAC | Tail]) -> reduce(Pid, command, Tail); reduce(Pid, text, [Head | Tail]) -> Pid ! {self(), {byte, Head}}, reduce(Pid, text, Tail); reduce(Pid, command, [?WILL, X | Tail]) -> % io:fwrite("WILL ~p~n", [option(X)]), reduce(Pid, text, Tail); reduce(Pid, command, [?WONT, X | Tail]) -> % io:fwrite("WONT ~p~n", [option(X)]), reduce(Pid, text, Tail); reduce(Pid, command, [?DO, X | Tail]) -> % io:fwrite("DO ~p~n", [option(X)]), reduce(Pid, text, Tail); reduce(Pid, command, [?DONT, X | Tail]) -> % io:fwrite("DONT ~p~n", [option(X)]), reduce(Pid, text, Tail); reduce(Pid, command, [X | Tail]) -> % io:fwrite("?? ~p~n", [X]), reduce(Pid, text, Tail). option(?TRANSMIT_BINARY) -> 'TRANSMIT-BINARY'; option(?ECHO) -> 'ECHO'; option(?SUPPRESS_GO_AHEAD) -> 'SUPPRESS-GO-AHEAD'; option(N) -> N. %% interface %% %% @spec send(Telnet::pid(), Text::string()) -> ok | {error, Reason} %% @doc Sends some text to a telnet session. send(Telnet, Text) -> Telnet ! {output, Text}, ok. %% @spec send_file(Telnet::pid(), filename()) -> ok | {error, Reason} %% @doc Sends a text file to a telnet session. send_file(Telnet, FileName) -> ce_file:each_line(fun(Line, Acc) -> Line0 = ce_string:chomp(Line), Telnet ! {output, [Line0, "\n\r"]}, ok end, ok, filename:join([code:priv_dir(ebbs), FileName])). %% @spec get_line(Telnet::pid()) -> {ok, string()} | {error, Reason} %% @doc Gets a line of text from a telnet session. get_line(Telnet) -> get_line(Telnet, ""). get_line(Telnet, Acc) -> receive {Telnet, closed} -> {error, closed}; {Telnet, {byte, NL}} when NL == 10; NL == 13 -> Telnet ! {output, "\r\n"}, {ok, lists:reverse(Acc)}; {Telnet, {byte, 8}} when Acc == [] -> Telnet ! {output, [7]}, get_line(Telnet, Acc); {Telnet, {byte, 8}} -> Telnet ! {output, "\b \b"}, get_line(Telnet, tl(Acc)); {Telnet, {byte, Char}} -> Telnet ! {output, [Char]}, get_line(Telnet, [Char | Acc]) end. %% @spec get_char(Telnet::pid()) -> {ok, char()} | {error, Reason} %% char() = integer() %% @doc Gets a single character from a telnet session. get_char(Telnet) -> get_char(Telnet, fun(X) -> true end). get_char(Telnet, Fun) -> receive {Telnet, closed} -> {error, closed}; {Telnet, {byte, Char}} -> case Fun(Char) of true -> {ok, Char}; _ -> get_char(Telnet, Fun) end end. %%% END of ce_telnet.erl %%% |
From: <cpr...@us...> - 2003-03-01 08:19:20
|
Update of /cvsroot/jungerl/jungerl/lib/ce/src In directory sc8-pr-cvs1:/tmp/cvs-serv4613/src Modified Files: ce_socket.erl Log Message: Fixed race condition in ce_socket:server_loop. Index: ce_socket.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ce/src/ce_socket.erl,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ce_socket.erl 1 Mar 2003 07:10:21 -0000 1.1 +++ ce_socket.erl 1 Mar 2003 08:19:17 -0000 1.2 @@ -35,10 +35,13 @@ %% @doc Socket library. %% +%% <p>This library contains functions which create TCP/IP socket +%% servers and clients.</p> +%% %% @end -module(ce_socket). --vsn('JUNGERL'). +-vsn('JUNGERL'). -author('ca...@ca...'). -copyright('Copyright (c)2003 Cat`s Eye Technologies. All rights reserved.'). @@ -59,7 +62,7 @@ %% @doc Implements a generic TCP/IP socket server. %% Opens a socket with the given options on the given %% port and spawns <code>Module:Function(Socket, Args...)</code> to handle -%% each incoming connection, up to the specified maximum. +%% each incoming connection, up to the specified maximum number of connections. server(Mod, Func, Args, Port, Opts, MaxCon) -> inet_db:start(), @@ -73,23 +76,38 @@ end. %% @spec server_setup(Mod::atom(), Func::atom(), Args::[term()], -%% lsocket(), Port::integer(), Opts::[option()], +%% LSock::listen_socket(), Port::integer(), Opts::[option()], %% MaxCon::integer()) -> never_returns %% @doc Used by <code>server/6</code> to handle the listen socket. %% This function should not be called directly by users of this module. -server_setup(Mod, Func, Args, LSock, Port, Opts, MaxCon) -> - Accepter = spawn(?MODULE, asynch_accept, [self(), LSock]), - process_flag(trap_exit, true), - server_loop(Mod, Func, Args, LSock, Port, Opts, MaxCon, Accepter). - -server_loop(Mod, Func, Args, LSock, Port, Opts, MaxCon=0, Accepter) -> - % io:fwrite("connections maxed out, killing accepter~n"), - Accepter ! {'EXIT', normal}, +server_setup(Mod, Func, Args, LSock, Port, Opts, MaxCon=0) -> + % When the maximum number of connections has been reached, wait + % until a socket connection dies before starting any more accepts. receive {'EXIT', Pid, Reason} -> server_setup(Mod, Func, Args, LSock, Port, Opts, MaxCon + 1) end; +server_setup(Mod, Func, Args, LSock, Port, Opts, MaxCon) -> + % By setting the process flag trap_exit to true, we will recieve + % {'EXIT',Pid,Reason} messages for any linked processes that die + process_flag(trap_exit, true), + % Therefore, this call is not a spawn_link because we only want to + % get exit messages when the user socket handlers die + Accepter = spawn(?MODULE, asynch_accept, [self(), LSock]), + server_loop(Mod, Func, Args, LSock, Port, Opts, MaxCon, Accepter). + +%% @spec server_loop(Mod::atom(), Func::atom(), Args::[term()], +%% LSock::listen_socket(), Port::integer(), Opts::[option()], +%% MaxCon::integer(), Accepter::pid()) -> never_returns +%% @doc Called by <code>server_setup/7</code> to handle the listen socket. +%% This function waits around for something to happen: +%% either for a message to arrive from the previous <code>asynch_accept/2</code> +%% (meaning there is now one more connection), or for the exit signal of an +%% existing socket process (meaning there is now one less connection.) In the +%% former case, a new asynchronous <code>accept</code> call is set up by +%% looping back to <code>server_setup/7</code>. + server_loop(Mod, Func, Args, LSock, Port, Opts, MaxCon, Accepter) -> receive {Accepter, {ok, Socket}} -> @@ -106,11 +124,11 @@ server_loop(Mod, Func, Args, LSock, Port, Opts, MaxCon + 1, Accepter) end. -%% @spec asynch_accept(Parent::pid(), lsocket()) -> never_returns() -%% @doc Used by <code>server_loop</code> to handle the listen socket. -%% It waits for a connection and notifies the parent process which spawned it -%% when a connection happens, allowing the parent to process other messages -%% in the meantime. +%% @spec asynch_accept(Parent::pid(), LSock::listen_socket()) -> never_returns +%% @doc Used by <code>server_loop/8</code> to handle the listen socket. +%% This function waits for a connection using <code>gen_tcp:accept/1</code> +%% and notifies the parent process which spawned it when a connection happens, +%% allowing the parent to process other messages in the meantime. %% This function should not be called directly by users of this module. asynch_accept(Parent, LSock) -> @@ -126,7 +144,7 @@ %% @spec client(module(), function(), args(), address(), port(), options()) -> pid() | {error, Reason} %% @doc Implements a generic socket client. %% Connects to a socket with the given options on the given -%% port and spawns Module:Function(Socket, Args...) to handle +%% port and spawns <code>Module:Function(Socket, Args...)</code> to handle %% the connection. client(Module, Function, Args, Address, Port, Options) -> @@ -141,9 +159,10 @@ Other end. -%% @spec client(address(), port(), options(), interval()) -> {ok, socket()} | {error, Reason} +%% @spec client(address(), port(), options(), Interval::interval()) -> {ok, socket()} | {error, Reason} %% @doc Waits for a server to become available, connects to it, and -%% returns a socket. Tries the server every (interval) milliseconds. +%% returns a socket. This function tries to contact the server repeatedly, +%% every <code>Interval</code> milliseconds. client(Host, Port, Options, Interval) -> case gen_tcp:connect(Host, Port, Options) of @@ -165,8 +184,9 @@ %% presumably coupled similarly.) Likewise, messages sent from the other %% end of the connection will be delivered to the owner. %% In essence this allows two Erlang sessions to communicate with each other -%% in the same manner as communicating with any other process, without -%% relying on the distribution mechanism. +%% in the same manner as communicating with any other process (that is, +%% by sending Erlang messages,) without the nodes necessarily even being in +%% the same distribution, or indeed any distribution at all. %% The socket should be opened in binary mode. couple(Socket, Pid) -> @@ -177,6 +197,7 @@ %% @spec coupler(socket(), pid()) -> ok %% @doc Used by couple/2 to achieve socket/process coupling. +%% Translates tcp messages to Erlang terms and vice versa. %% This function should not be called directly by users of this module. coupler(Socket, Owner) -> |
From: <cpr...@us...> - 2003-03-01 07:10:24
|
Update of /cvsroot/jungerl/jungerl/lib/ce/ebin In directory sc8-pr-cvs1:/tmp/cvs-serv22287/lib/ce/ebin Added Files: .empty Log Message: Imported ce library. --- NEW FILE: .empty --- |
From: <cpr...@us...> - 2003-03-01 07:10:24
|
Update of /cvsroot/jungerl/jungerl/lib/ce/doc In directory sc8-pr-cvs1:/tmp/cvs-serv22287/lib/ce/doc Added Files: .empty Log Message: Imported ce library. --- NEW FILE: .empty --- |
From: <cpr...@us...> - 2003-03-01 07:10:23
|
Update of /cvsroot/jungerl/jungerl/lib/ce In directory sc8-pr-cvs1:/tmp/cvs-serv22287/lib/ce Added Files: Makefile README.jungerl Log Message: Imported ce library. --- NEW FILE: Makefile --- include ../../support/subdir.mk --- NEW FILE: README.jungerl --- ce README.jungerl ----------------- This is a Jungerlified version of my miscellaneous Erlang/OTP programming support library. It is a container for a plethora of modules with little in common except that they may contain functions which I've found handy to use and reuse. Most of these functions are neither efficient, nor do they have beautiful error handling. It is also true that they give you a multitude of extra ways to shoot yourself in the foot. They may, however, be useful for prototyping, as example code, etc. ce is included in the Jungerl mainly to support my own submissions which already use it, but if you find it useful, you're welcome to use the functions in it, and to add functions and modules to it. |
From: <cpr...@us...> - 2003-03-01 07:10:23
|
Update of /cvsroot/jungerl/jungerl/lib In directory sc8-pr-cvs1:/tmp/cvs-serv22287/lib Modified Files: Makefile Log Message: Imported ce library. Index: Makefile =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/Makefile,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- Makefile 26 Feb 2003 15:33:02 -0000 1.8 +++ Makefile 1 Mar 2003 07:10:21 -0000 1.9 @@ -1,5 +1,6 @@ LIBS := \ - edoc \ + ce \ + edoc \ enfs \ ermacs \ ex11 \ @@ -29,6 +30,7 @@ fi # Dependencies between programs. +ce: edoc edoc: syntax_tools xmerl ermacs: slang msc enfs: rpc |
From: <cpr...@us...> - 2003-03-01 07:08:00
|
Update of /cvsroot/jungerl/jungerl/lib/ce/doc In directory sc8-pr-cvs1:/tmp/cvs-serv21743/doc Log Message: Directory /cvsroot/jungerl/jungerl/lib/ce/doc added to the repository |
From: <cpr...@us...> - 2003-03-01 07:08:00
|
Update of /cvsroot/jungerl/jungerl/lib/ce/ebin In directory sc8-pr-cvs1:/tmp/cvs-serv21743/ebin Log Message: Directory /cvsroot/jungerl/jungerl/lib/ce/ebin added to the repository |
From: <cpr...@us...> - 2003-03-01 07:08:00
|
Update of /cvsroot/jungerl/jungerl/lib/ce/src In directory sc8-pr-cvs1:/tmp/cvs-serv21743/src Log Message: Directory /cvsroot/jungerl/jungerl/lib/ce/src added to the repository |
From: <cpr...@us...> - 2003-03-01 07:07:42
|
Update of /cvsroot/jungerl/jungerl/lib/ce In directory sc8-pr-cvs1:/tmp/cvs-serv21667/ce Log Message: Directory /cvsroot/jungerl/jungerl/lib/ce added to the repository |
From: <cpr...@us...> - 2003-03-01 06:09:11
|
Update of /cvsroot/jungerl/jungerl/lib/pan/ebin In directory sc8-pr-cvs1:/tmp/cvs-serv7132/ebin Added Files: .empty Log Message: Jungerlified further --- NEW FILE: .empty --- |
From: <cpr...@us...> - 2003-03-01 06:09:11
|
Update of /cvsroot/jungerl/jungerl/lib/pan In directory sc8-pr-cvs1:/tmp/cvs-serv7132 Modified Files: Makefile Log Message: Jungerlified further Index: Makefile =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/pan/Makefile,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile 28 Feb 2003 15:49:44 -0000 1.2 +++ Makefile 1 Mar 2003 06:09:08 -0000 1.3 @@ -1,4 +1,5 @@ -ERLC = /EDUP/Erlang/R7B-4/bin/erlc +include ../../support/include.mk + EFLAGS = -W +debug_info ERLS = $(shell echo src/*.erl) |
From: <vl...@us...> - 2003-02-28 20:33:18
|
Update of /cvsroot/jungerl/jungerl/lib/ex11 In directory sc8-pr-cvs1:/tmp/cvs-serv3058 Added Files: TODO Log Message: Converted to use of binaries. --- NEW FILE: TODO --- |
From: <vl...@us...> - 2003-02-28 20:32:10
|
Update of /cvsroot/jungerl/jungerl/lib/ex11/include In directory sc8-pr-cvs1:/tmp/cvs-serv2392/include Modified Files: ex11.hrl Log Message: Converted to use of binaries. Index: ex11.hrl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/include/ex11.hrl,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ex11.hrl 26 Feb 2003 14:50:30 -0000 1.1 +++ ex11.hrl 28 Feb 2003 20:31:33 -0000 1.2 @@ -347,20 +347,53 @@ -define(PRINT_ERROR(E), error_logger:error_msg( - "ERROR-MSG: type = ~w seqno = ~w minor_opcode = ~w major_opcode = ~w~n", - [E#error.type,E#error.seqno,E#error.minor_opcode,E#error.major_opcode])). + "ERROR-MSG: type= ~w seqno= ~w minor_opcode =~w major_opcode= ~w id= ~w~n", + [E#error.type,E#error.seqno,E#error.minor_opcode,E#error.major_opcode,E#error.bad_resource_id])). %% --------------- %% EVENT MESSAGES %% --------------- %% Event codes +-define(EVENT_KEYPRESS, 2). +-define(EVENT_KEYRELEASE, 3). +-define(EVENT_BUTTONPRESS, 4). +-define(EVENT_BUTTONRELEASE, 5). +-define(EVENT_MOTION_NOTIFY, 6). +-define(EVENT_ENTER_NOTIFY, 7). +-define(EVENT_LEAVE_NOTIFY, 8). +-define(EVENT_FOCUS_IN, 9). +-define(EVENT_FOCUS_OUT, 10). +-define(EVENT_KEYMAP_NOTIFY, 11). -define(EVENT_EXPOSE, 12). +-define(EVENT_GRAPHICS_EXPOSURE, 13). +-define(EVENT_NO_EXPOSURE, 14). +-define(EVENT_VISIBILITY_NOTIFY, 15). +-define(EVENT_CREATE_NOTIFY, 16). +-define(EVENT_DESTROY_NOTIFY, 17). +-define(EVENT_UNMAP_NOTIFY, 18). -define(EVENT_MAP_NOTIFY, 19). +-define(EVENT_MAP_REQUEST, 20). -define(EVENT_REPARENT_NOTIFY, 21). -define(EVENT_CONFIGURE_NOTIFY, 22). +-define(EVENT_CONFIGURE_REQUEST, 23). +-define(EVENT_GRAVITY_NOTIFY, 24). +-define(EVENT_RESIZE_REQUEST, 25). +-define(EVENT_CIRCULATE_NOTIFY, 26). +-define(EVENT_CIRCULATE_REQUEST, 27). +-define(EVENT_PROPERTY_NOTIFY, 28). +-define(EVENT_SELECTION_CLEAR, 29). +-define(EVENT_SELECTION_REQUEST, 30). +-define(EVENT_SELECTION_NOTIFY, 31). +-define(EVENT_COLORMAP_NOTIFY, 32). +-define(EVENT_CLIENT_MESSAGE, 33). +-define(EVENT_MAPPING_NOTIFY, 34). %% Event records +-record(key_press, {seqno}). + +-record(key_release, {seqno}). + -record(expose, {seqno, window, x, y, width, height, count}). -record(map_notify, {seqno, event, window, override_redirect}). @@ -371,10 +404,12 @@ width, height, border_width, override_redirect}). %% Event guards --define(IS_EXPOSE_EVENT(E), record(E,expose)). --define(IS_MAP_NOTIFY_EVENT(E), record(E,map_notify)). --define(IS_REPARENT_NOTIFY_EVENT(E), record(E,reparent_notify)). --define(IS_CONFIGURE_NOTIFY_EVENT(E), record(E,configure_notify)). +-define(IS_KEY_PRESS_EVENT(E), record(E, key_press)). +-define(IS_KEY_RELEASE_EVENT(E), record(E, key_release)). +-define(IS_EXPOSE_EVENT(E), record(E, expose)). +-define(IS_MAP_NOTIFY_EVENT(E), record(E, map_notify)). +-define(IS_REPARENT_NOTIFY_EVENT(E), record(E, reparent_notify)). +-define(IS_CONFIGURE_NOTIFY_EVENT(E), record(E, configure_notify)). %% TEMPORARY: Until all events is implemented -record(event_nyi, {event}). |
Update of /cvsroot/jungerl/jungerl/lib/ex11/src In directory sc8-pr-cvs1:/tmp/cvs-serv2392/src Modified Files: ex11.erl ex11_client.erl ex11_db.erl ex11_proto.erl ex11_utils.erl ex11_xauth.erl matrix44.erl rcube.erl Log Message: Converted to use of binaries. Index: ex11.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/ex11.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ex11.erl 26 Feb 2003 15:25:01 -0000 1.2 +++ ex11.erl 28 Feb 2003 20:31:35 -0000 1.3 @@ -23,7 +23,6 @@ %%% Contributor(s): ______________________________________. %%% %%%--------------------------------------------------------------------- --vc('$Id$ '). -export([start/1,req/2,synchronize/2,flush/1,get_display/1,set_display/2, lock_display/1,unlock_display/1]). Index: ex11_client.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/ex11_client.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ex11_client.erl 26 Feb 2003 15:25:01 -0000 1.2 +++ ex11_client.erl 28 Feb 2003 20:31:37 -0000 1.3 @@ -28,7 +28,6 @@ %%% use of ex11_xauth:filename/0. %%% %%%--------------------------------------------------------------------- --vc('$Id$ '). -export([start/1,req/2,synchronize/2,flush/1,lock_display/1,unlock_display/1, set_display/2,get_display/1,new_window/2,new_pixmap/2,new_gc/2]). %% Internal exports @@ -176,13 +175,13 @@ receive {From,send_msg,Msg} when Sync == ?FLUSH -> - %%io:format("SENDING REQUEST: ~p~n",[Msg]), + %%io:format("SENDING REQUEST: ~w~n",[binary_to_list(Msg)]), NewSeqNo = send_request(Dpy,SeqNo,Msg), return(From,ok), loop(Dpy,Db,Out,Cont,NewSeqNo,Sync,Lock); {From,send_msg,Msg} when Sync == ?BUFFER -> - %%io:format("BUFFERING REQUEST: ~p~n",[Msg]), + %%io:format("BUFFERING REQUEST: ~w~n",[binary_to_list(Msg)]), return(From,ok), loop(Dpy,Db,queue:in(Msg,Out),Cont,SeqNo,Sync,Lock); @@ -249,7 +248,7 @@ loop(Dpy,NewDb,Out,Cont,SeqNo,Sync,Lock); XX -> - io:format("GOT: ~p~n",[XX]), + io:format("GOT: ~w~n",[XX]), loop(Dpy,Db,Out,Cont,SeqNo,Sync,Lock) end. @@ -296,8 +295,10 @@ loop(Dpy,Db,Out,?NO_CONT,SeqNo,Sync,Lock) end. -decode(Db,?NO_CONT,Data) -> ex11_proto:decode(Db,Data); -decode(Db,C,Data) when ?IS_CONT(C) -> ?CONTINUE(C,{Db,Data}). +decode(Db,?NO_CONT,Data) -> + ex11_proto:decode(Db,Data); +decode(Db,C,Data) when ?IS_CONT(C) -> + ?CONTINUE(C,{Db,Data}). %% ----------------------------------------- %% Deliver an event to the correct process @@ -324,26 +325,30 @@ %% See p.113 in the X Protocol standard X11 Rel-6.4 setup_connection(Host,Cookie) -> - Opts = [{packet,raw}], + Opts = [{packet,raw},binary], case gen_tcp:connect(Host,6000,Opts) of {ok,Fd} -> - gen_tcp:send(Fd,ex11_proto:setup_connection(Cookie)), + Res=gen_tcp:send(Fd,ex11_proto:setup_connection(Cookie)), get_connect_reply(Fd); Error -> exit(Error) end. get_connect_reply(Fd) -> - case recv(Fd) of - [0|Emsg] -> {error,ex11_proto:decode_error(Emsg)}; - [2|_] -> {error,"authentication required"}; - [1,_|Msg] -> ex11_proto:decode_connect_reply(Fd,Msg) + Rec = recv(Fd), + case Rec of + <<0, Emsg/binary>> -> + {error,ex11_proto:decode_error(Emsg)}; + <<2,_/binary>> -> + {error,"authentication required"}; + <<1,_,Msg/binary>> -> + ex11_proto:decode_connect_reply(Fd,Msg) end. %% ---------------------------------------------------- %% Send a request to the X-server. send_request(Dpy,SeqNo,Msg) -> - gen_tcp:send(Dpy#display.fd,[Msg]), + gen_tcp:send(Dpy#display.fd, Msg), bump_seqno(SeqNo). %% Also, if the request will initiate a reply from the @@ -361,7 +366,8 @@ recv(Fd) -> receive - {tcp,Fd,Data} -> Data + {tcp,Fd,Data} -> + Data end. Index: ex11_db.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/ex11_db.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ex11_db.erl 26 Feb 2003 15:25:02 -0000 1.2 +++ ex11_db.erl 28 Feb 2003 20:31:37 -0000 1.3 @@ -22,7 +22,6 @@ %%% Contributor(s): ______________________________________. %%% %%%--------------------------------------------------------------------- --vc('$Id$ '). -export([init/0,get_display/1,set_display/2,put_window/3,put_pixmap/3, put_gc/3,put_id/4,get_id/2,store_req/4,get_reply/2]). Index: ex11_proto.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/ex11_proto.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ex11_proto.erl 26 Feb 2003 15:25:02 -0000 1.2 +++ ex11_proto.erl 28 Feb 2003 20:31:37 -0000 1.3 @@ -27,12 +27,10 @@ %%% To make it work under Windows. %%% %%%--------------------------------------------------------------------- --vc('$Id$ '). -export([map_window/2,create_window/2,decode_error/1, setup_connection/1,decode_refused_connection/1, decode/2,decode_connect_reply/2,encode/2]). --import(ex11_utils,[i16/1,i16/2,i32/1,i32/4,split_list/2]). -import(error_logger,[error_msg/2]). -include("ex11.hrl"). @@ -46,7 +44,7 @@ setup_connection([]) -> <<?MSB_BYTEORDER:8, % Erlang byte-order - 0:8, % unused + 0, % unused 11:16, % proto-major-ver 0:16, % proto-minor-ver 0:16, % proto-name-len @@ -56,7 +54,7 @@ Len = length(Cookie), Pad = add_pad(Cookie), <<?MSB_BYTEORDER:8, % Erlang byte-order - 0:8, % unused + 0, % unused 11:16, % proto-major-ver 0:16, % proto-minor-ver 18:16, % proto-name-len @@ -64,30 +62,30 @@ 0:16, % unused "MIT-MAGIC-COOKIE-1", % auth-proto-name 0:16, % pad - Cookie, % auth-proto-data - Pad>>. % pad + (list_to_binary(Cookie))/binary, % auth-proto-data + Pad/binary>>. % pad decode_refused_connection(<<Len,ProtoMaj:16,ProtoMin:16,_TotLen:16,D/binary>>) -> - <<ReasonB:Len/binary, _D1/binary>> = D, + <<ReasonB:Len/binary, _/binary>> = D, Reason = binary_to_list(ReasonB), #refused_connection{maj_proto=ProtoMaj, min_proto=ProtoMin, reason=Reason}. - + decode_connect_reply(Fd,Msg) -> <<_:32, _Len:16, RelNo:32, ResBase:32, ResMask0:32, - MbufSz:32, VendorLen:16, MaxReqLen:16, - Screens, Formats, - ImOrder, BmapOrder, BmapScanU, BmapScanP, - MinKCode, MaxKCode, _:32, - B/binary>> = list_to_binary(Msg), - VendorPad = bpad(VendorLen), + MbufSz:32, VendorLen:16, MaxReqLen:16, + Screens, Formats, + ImOrder, BmapOrder, BmapScanU, BmapScanP, + MinKCode, MaxKCode, _:32, + B/binary>> = Msg, + VendorPad = pad(VendorLen), PmapFormLen = 8*Formats, <<VendorB:VendorLen/binary, - _:VendorPad, - PmapForm:PmapFormLen/binary, - PmapScreen/binary>> = B, - + _:VendorPad/binary, + PmapForm:PmapFormLen/binary, + PmapScreen/binary>> = B, + {ResMask,ResShift} = resource_calc(ResMask0), Vendor = binary_to_list(VendorB), Format = decode_format(Formats,PmapForm), @@ -112,6 +110,7 @@ nformats=Formats, pixmap_formats=Format, fd=Fd}, + {ok,Display}. %% Eh...what a hell am I doing here ? See OpenDis.c l.374 @@ -133,7 +132,7 @@ Format = #format{depth=Depth, bpp=Bpp, scanline_pad=ScanlinePad - }, + }, [Format | decode_format(N-1,T)]. decode_screen(0, _) -> []; @@ -166,7 +165,7 @@ depths=Depths, root_depth=Rd}, [Screen | decode_screen(N-1,Rest)]. - + decode_depth(Nd,D) -> decode_depth(Nd,D,[]). decode_depth(0,Rest,Acc) -> {lists:reverse(Acc),Rest}; @@ -230,7 +229,7 @@ %% ----------------------- %% The Change GC request -change_gc(X,#change_gc{opcode=Opcode, cid=Cid, value_mask=ValueMask}=R) +change_gc(_X, #change_gc{opcode=Opcode, cid=Cid, value_mask=ValueMask}=R) when Cid =/= undefined -> ValueList = encode_gc_valuelist(ValueMask, R#change_gc.value_list), Len = 3 + length(ValueList), @@ -245,9 +244,9 @@ %% ----------------------- %% The clear area request -clear_area(X,#clear_area{}=R) when R#clear_area.window =/= undefined, - R#clear_area.width =/= undefined, - R#clear_area.height =/= undefined -> +clear_area(_X, #clear_area{}=R) when R#clear_area.window =/= undefined, + R#clear_area.width =/= undefined, + R#clear_area.height =/= undefined -> {ok, <<(R#clear_area.opcode), (R#clear_area.exposures), @@ -261,15 +260,15 @@ %% ---------------------- %% The copy area request -copy_area(X,R) when R#copy_area.src =/= undefined, - R#copy_area.dst =/= undefined, - R#copy_area.cid =/= undefined, - R#copy_area.src_x =/= undefined, - R#copy_area.src_y =/= undefined, - R#copy_area.dst_x =/= undefined, - R#copy_area.dst_y =/= undefined, - R#copy_area.width =/= undefined, - R#copy_area.height =/= undefined -> +copy_area(_X, R) when R#copy_area.src =/= undefined, + R#copy_area.dst =/= undefined, + R#copy_area.cid =/= undefined, + R#copy_area.src_x =/= undefined, + R#copy_area.src_y =/= undefined, + R#copy_area.dst_x =/= undefined, + R#copy_area.dst_y =/= undefined, + R#copy_area.width =/= undefined, + R#copy_area.height =/= undefined -> {ok, <<(R#copy_area.opcode), 0, % unused @@ -287,7 +286,7 @@ %% --------------------- %% The Create GC request -create_gc(X,R) when R#create_gc.drawable =/= undefined -> +create_gc(X, R) when R#create_gc.drawable =/= undefined -> Cid = case R#create_gc.cid of undefined -> ex11:lock_display(X), @@ -301,67 +300,92 @@ end, ValueMask = R#create_gc.value_mask, ValueList = encode_gc_valuelist(ValueMask,R#create_gc.value_list), - {ok, - [(R#create_gc.opcode), - 0, % unused - i16(4 + length(ValueList)), - i32(Cid), - i32(R#create_gc.drawable), - i32(ValueMask), - ValueList], - {ok,Cid}}. + + B = <<(R#create_gc.opcode), + 0, % unused + (4 + size(ValueList) div 4):16, + (Cid):32, + (R#create_gc.drawable):32, + (ValueMask):32, + ValueList/binary>>, + + {ok, B, {ok,Cid}}. encode_gc_valuelist(ValueMask,R) when ?IS_GC_VALUES(R) -> enc_gc_vl(ValueMask,R). enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_FUNCTION) -> - [i32(R#gc_values.function)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FUNCTION),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FUNCTION),R), + <<(R#gc_values.function):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_PLANE_MASK) -> - [i32(R#gc_values.plane_mask)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_PLANE_MASK),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_PLANE_MASK),R), + <<(R#gc_values.plane_mask):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_FOREGROUND) -> - [i32(R#gc_values.foreground)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FOREGROUND),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FOREGROUND),R), + <<(R#gc_values.foreground):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_BACKGROUND) -> - [i32(R#gc_values.background)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_BACKGROUND),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_BACKGROUND),R), + <<(R#gc_values.background):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_LINE_WIDTH) -> - [i32(R#gc_values.line_width)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_LINE_WIDTH),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_LINE_WIDTH),R), + <<(R#gc_values.line_width):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_LINE_STYLE) -> - [i32(R#gc_values.line_style)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_LINE_STYLE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_LINE_STYLE),R), + <<(R#gc_values.line_style):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_CAP_STYLE) -> - [i32(R#gc_values.cap_style)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CAP_STYLE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CAP_STYLE),R), + <<(R#gc_values.cap_style):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_JOIN_STYLE) -> - [i32(R#gc_values.join_style)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_JOIN_STYLE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_JOIN_STYLE),R), + <<(R#gc_values.join_style):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_FILL_STYLE) -> - [i32(R#gc_values.fill_style)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FILL_STYLE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FILL_STYLE),R), + <<(R#gc_values.fill_style):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_FILL_RULE) -> - [i32(R#gc_values.fill_rule)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FILL_RULE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FILL_RULE),R), + <<(R#gc_values.fill_rule):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_TILE) -> - [i32(R#gc_values.tile)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_TILE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_TILE),R), + <<(R#gc_values.tile):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_STIPPLE) -> - [i32(R#gc_values.stipple)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_STIPPLE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_STIPPLE),R), + <<(R#gc_values.stipple):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_TILE_STIPPLE_X) -> - [i32(R#gc_values.tile_stipple_x)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_TILE_STIPPLE_X),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_TILE_STIPPLE_X),R), + <<(R#gc_values.tile_stipple_x):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_TILE_STIPPLE_Y) -> - [i32(R#gc_values.tile_stipple_y)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_TILE_STIPPLE_Y),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_TILE_STIPPLE_Y),R), + <<(R#gc_values.tile_stipple_y):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_FONT) -> - [i32(R#gc_values.font)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FONT),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_FONT),R), + <<(R#gc_values.font):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_SUBWIN_MODE) -> - [i32(R#gc_values.subwin_mode)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_SUBWIN_MODE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_SUBWIN_MODE),R), + <<(R#gc_values.subwin_mode):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_EXPOSURES) -> - [i32(R#gc_values.exposures)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_EXPOSURES),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_EXPOSURES),R), + <<(R#gc_values.exposures):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_CLIP_X) -> - [i32(R#gc_values.clip_x)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CLIP_X),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CLIP_X),R), + <<(R#gc_values.clip_x):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_CLIP_Y) -> - [i32(R#gc_values.clip_y)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CLIP_Y),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CLIP_Y),R), + <<(R#gc_values.clip_y):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_CLIP_MASK) -> - [i32(R#gc_values.clip_mask)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CLIP_MASK),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_CLIP_MASK),R), + <<(R#gc_values.clip_mask):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_DASH_OFFSET) -> - [i32(R#gc_values.dash_offset)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_DASH_OFFSET),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_DASH_OFFSET),R), + <<(R#gc_values.dash_offset):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_DASHES) -> - [i32(R#gc_values.dashes)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_DASHES),R)]; + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_DASHES),R), + <<(R#gc_values.dashes):32, Rest/binary>>; enc_gc_vl(Vm,R) when ?IS_SET(Vm,?GC_VALUEMASK_ARC_MODE) -> - [i32(R#gc_values.arc_mode)|enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_ARC_MODE),R)]; -enc_gc_vl(_,_) -> []. + Rest = enc_gc_vl(?CLR(Vm,?GC_VALUEMASK_ARC_MODE),R), + <<(R#gc_values.arc_mode):32, Rest/binary>>; +enc_gc_vl(_,_) -> + <<>>. %% -------------------------- %% The Create Pixmap request @@ -384,15 +408,15 @@ undefined -> ?ROOT_DEPTH(Dpy); Depth0 -> Depth0 end, - {ok, - [R#create_pixmap.opcode, - Depth, - i16(4), - i32(Pid), - i32(R#create_pixmap.drawable), - i16(R#create_pixmap.width), - i16(R#create_pixmap.height)], - {ok,Pid}}. + B = <<(R#create_pixmap.opcode), + Depth, + 4:16, + (Pid):32, + (R#create_pixmap.drawable):32, + (R#create_pixmap.width):16, + (R#create_pixmap.height):16>>, + + {ok, B, {ok,Pid}}. %% -------------------------- %% The Create Window request @@ -422,285 +446,332 @@ ValueMask = R#create_window.value_mask, ValueList = encode_win_valuelist(ValueMask, R#create_window.value_list), - {ok, - [R#create_window.opcode, - Depth, - i16(8+length(ValueList)), - i32(Win), - i32(Parent), - i16(R#create_window.x), - i16(R#create_window.y), - i16(R#create_window.width), - i16(R#create_window.height), - i16(R#create_window.border_width), - i16(R#create_window.class), - i32(R#create_window.visual), - i32(R#create_window.value_mask), - ValueList], - {ok,Win}}. + B = <<(R#create_window.opcode), + Depth, + (8+size(ValueList) div 4):16, + (Win):32, + (Parent):32, + (R#create_window.x):16, + (R#create_window.y):16, + (R#create_window.width):16, + (R#create_window.height):16, + (R#create_window.border_width):16, + (R#create_window.class):16, + (R#create_window.visual):32, + (R#create_window.value_mask):32, + ValueList/binary>>, + + {ok, B, {ok,Win}}. encode_win_valuelist(ValueMask,R) when ?IS_WIN_VALUES(R) -> enc_win_vl(ValueMask,R). enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BG_PIXMAP) -> - [i32(R#win_values.bg_pixmap)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BG_PIXMAP),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BG_PIXMAP),R), + <<(R#win_values.bg_pixmap):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BG_PIXEL) -> - [i32(R#win_values.bg_pixel)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BG_PIXEL),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BG_PIXEL),R), + <<(R#win_values.bg_pixel):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BD_PIXMAP) -> - [i32(R#win_values.bd_pixmap)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BD_PIXMAP),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BD_PIXMAP),R), + <<(R#win_values.bd_pixmap):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BD_PIXEL) -> - [i32(R#win_values.bd_pixel)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BD_PIXEL),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BD_PIXEL),R), + <<(R#win_values.bd_pixel):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BIT_GRAVITY) -> - [i32(R#win_values.bit_gravity)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BIT_GRAVITY),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BIT_GRAVITY),R), + <<(R#win_values.bit_gravity):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_WIN_GRAVITY) -> - [i32(R#win_values.win_gravity)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_WIN_GRAVITY),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_WIN_GRAVITY),R), + <<(R#win_values.win_gravity):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BACKING_STORE) -> - [i32(R#win_values.backing_store)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BACKING_STORE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BACKING_STORE),R), + <<(R#win_values.backing_store):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BACKING_PLANES) -> - [i32(R#win_values.backing_planes)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BACKING_PLANES),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BACKING_PLANES),R), + <<(R#win_values.backing_planes):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_BACKING_PIXEL) -> - [i32(R#win_values.backing_pixel)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BACKING_PIXEL),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_BACKING_PIXEL),R), + <<(R#win_values.backing_pixel):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_OVERRIDE_REDIRECT) -> - [i32(R#win_values.override_redirect)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_OVERRIDE_REDIRECT),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_OVERRIDE_REDIRECT),R), + <<(R#win_values.override_redirect):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_SAVE_UNDER) -> - [i32(R#win_values.save_under)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_SAVE_UNDER),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_SAVE_UNDER),R), + <<(R#win_values.save_under):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_EVENT_MASK) -> - [i32(R#win_values.event_mask)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_EVENT_MASK),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_EVENT_MASK),R), + <<(R#win_values.event_mask):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_DO_NOT_PROPAGATE) -> - [i32(R#win_values.do_not_propagate)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_DO_NOT_PROPAGATE),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_DO_NOT_PROPAGATE),R), + <<(R#win_values.do_not_propagate):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_COLORMAP) -> - [i32(R#win_values.colormap)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_COLORMAP),R)]; + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_COLORMAP),R), + <<(R#win_values.colormap):32, Rest/binary>>; enc_win_vl(Vm,R) when ?IS_SET(Vm,?WIN_VALUEMASK_CURSOR) -> - [i32(R#win_values.cursor)|enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_CURSOR),R)]; -enc_win_vl(_,_) -> []. + Rest = enc_gc_vl(?CLR(Vm,?WIN_VALUEMASK_CURSOR),R), + <<(R#win_values.cursor):32, Rest/binary>>; +enc_win_vl(_,_) -> + <<>>. %% -------------------------- %% The Get Geometry request. -get_geometry(X,R) when R#get_geometry.drawable =/= undefined -> +get_geometry(_X,R) when R#get_geometry.drawable =/= undefined -> {reply, - [R#get_geometry.opcode, + <<(R#get_geometry.opcode), 0, % unused - i16(R#get_geometry.len), - i32(R#get_geometry.drawable)], + (R#get_geometry.len):16, + (R#get_geometry.drawable):32>>, get_geometry_reply}. % Reply type %% ------------------------ %% The Map Window request. -map_window(X,R) -> - {ok,[R#map_window.opcode, +map_window(_X,R) -> + {ok,<<(R#map_window.opcode), 0, % unused - i16(R#map_window.len), - i32(R#map_window.window)]}. + (R#map_window.len):16, + (R#map_window.window):32>>}. %% -------------------------------- %% The Poly Fill Rectangle request -poly_fill_rectangle(X,R) when R#poly_fill_rectangle.drawable =/= undefined, - R#poly_fill_rectangle.cid =/= undefined, - list(R#poly_fill_rectangle.rectangles) -> - RectangleList = encode_rectangles(R#poly_fill_rectangle.rectangles), +poly_fill_rectangle(_X,R) when R#poly_fill_rectangle.drawable =/= undefined, + R#poly_fill_rectangle.cid =/= undefined, + list(R#poly_fill_rectangle.rectangles) -> + Rectangles = encode_rectangles(R#poly_fill_rectangle.rectangles), {ok, - [R#poly_fill_rectangle.opcode, + <<(R#poly_fill_rectangle.opcode), 0, % unused - i16(3 + length(RectangleList)), - i32(R#poly_fill_rectangle.drawable), - i32(R#poly_fill_rectangle.cid), - RectangleList]}. + (3 + size(Rectangles) div 4):16, + (R#poly_fill_rectangle.drawable):32, + (R#poly_fill_rectangle.cid):32, + Rectangles/binary>>}. encode_rectangles([H|T]) when ?IS_RECTANGLE(H) -> - [i16(H#rectangle.x) ++ i16(H#rectangle.y), - i16(H#rectangle.width) ++ i16(H#rectangle.height) - |encode_rectangles(T)]; -encode_rectangles([]) -> []. + <<(H#rectangle.x):16, (H#rectangle.y):16, + (H#rectangle.width):16, (H#rectangle.height):16, + (encode_rectangles(T))/binary>>; +encode_rectangles([]) -> <<>>. %% ---------------------- %% The Poly Line request -poly_line(X,R) when R#poly_line.drawable =/= undefined, - R#poly_line.gc =/= undefined, - list(R#poly_line.points) -> +poly_line(_X,R) when R#poly_line.drawable =/= undefined, + R#poly_line.gc =/= undefined, + list(R#poly_line.points) -> PointsList = encode_points(R#poly_line.points), {ok, - [R#poly_line.opcode, - R#poly_line.coord_mode, - i16(3 + length(PointsList)), - i32(R#poly_line.drawable), - i32(R#poly_line.gc), - PointsList]}. + <<(R#poly_line.opcode), + (R#poly_line.coord_mode), + (3 + size(PointsList) div 4):16, + (R#poly_line.drawable):32, + (R#poly_line.gc):32, + PointsList/binary>>}. encode_points([H|T]) when ?IS_POINT(H) -> - [i16(H#point.x) ++ i16(H#point.y)|encode_points(T)]; -encode_points([]) -> []. + <<(H#point.x):16, (H#point.y):16, (encode_points(T))/binary>>; +encode_points([]) -> <<>>. %% ---------------------- %% The Poly Segment request -poly_segment(X,R) when R#poly_segment.drawable =/= undefined, - R#poly_segment.gc =/= undefined, - list(R#poly_segment.segments) -> +poly_segment(_X,R) when R#poly_segment.drawable =/= undefined, + R#poly_segment.gc =/= undefined, + list(R#poly_segment.segments) -> SegmList = encode_segments(R#poly_segment.segments), {ok, - [R#poly_segment.opcode, - i16(3 + length(SegmList)), - i32(R#poly_segment.drawable), - i32(R#poly_segment.gc), - SegmList]}. + <<(R#poly_segment.opcode), + (3 + size(SegmList) div 4):16, + (R#poly_segment.drawable):32, + (R#poly_segment.gc):32, + SegmList/binary>>}. encode_segments([H|T]) when ?IS_SEGMENT(H) -> - [i16(H#segment.x1) ++ i16(H#segment.y1), - i16(H#segment.x2) ++ i16(H#segment.y2) - |encode_segments(T)]; -encode_segments([]) -> []. + <<(H#segment.x1):16, (H#segment.y1):16, + (H#segment.x2):16, (H#segment.y2):16, + (encode_segments(T))/binary>>; +encode_segments([]) -> + <<>>. %% ------------------ %% DECODING MESSAGES %% ------------------ -decode(Db,[]) -> decode_cont(Db,[]); -decode(_,[0|Emsg]) -> decode_error(Emsg); -decode(Db,[1|Reply]) -> decode_reply(Db,Reply); -decode(_,Event) -> decode_event(Event). +decode(Db,<<>>) -> +decode_cont(Db,<<>>); +decode(_,<<0, Emsg/binary>>) -> + decode_error(Emsg); +decode(Db,<<1, Reply/binary>>) -> + decode_reply(Db,Reply); +decode(_,Event) -> + decode_event(Event). -decode_cont(X,Msg) -> - #more{cont=fun({Db,More}) -> decode(Db,Msg ++ More) end}. +decode_cont(_X, Msg) -> + #more{cont = fun({Db,More}) -> + decode(Db, <<Msg/binary, More/binary>>) + end}. %% ------------------------ %% Decoding reply messages -decode_reply(Db,[B,S1,S0|D]) -> - SeqNo = i16(S1,S0), +decode_reply(Db,<<_B, SeqNo:16, _D/binary>>=R) -> case ex11_db:get_reply(Db,SeqNo) of {ok,{Pid,ReplyType}} when pid(Pid) -> - decode_reply_type(ReplyType,Pid,[B,S1,S0|D]); + decode_reply_type(ReplyType,Pid,R); _ -> - error_msg("unable to decode reply message: ~w~n",[[B,S1,S0|D]]) + error_msg("unable to decode reply message: ~w~n",[R]) end. -decode_reply_type(get_geometry_reply,Pid,[D,_,_,_,_,_,_,R3,R2,R1,R0,X1,X0, - Y1,Y0,W1,W0,H1,H0,B1,B0|T]) -> - {_,Rest} = split_list(10,T), % 10 unused bytes - Reply = #get_geometry_reply{depth=D, - root=i32(R3,R2,R1,R0), - x=i16(X1,X0), - y=i16(Y1,Y0), - width=i16(W1,W0), - height=i16(H1,H0), - border_width=i16(B1,B0)}, +decode_reply_type(get_geometry_reply,Pid,<<Depth,_:48,Root:32,X:16, + Y:16,W:16,H:16,Border:16, + _:80, Rest/binary>>) -> + Reply = #get_geometry_reply{depth=Depth, + root=Root, + x=X, + y=Y, + width=W, + height=H, + border_width=Border}, {reply,{Pid,Reply},Rest}. %% ------------------------ %% Decoding error messages -decode_error(Emsg) when length(Emsg)<32 -> +decode_error(Emsg) when size(Emsg)<32 -> error_cont(Emsg); -decode_error([?ERROR_IDCHOICE,S1,S0,R3,R2,R1,R0,Mi1,Mi0,Ma|D]) -> - {_,Rest} = split_list(21,D), % 21 unused bytes - E = #error{type=idchoice, - seqno=i16(S1,S0), - bad_resource_id=i32(R3,R2,R1,R0), - minor_opcode=i16(Mi1,Mi0), - major_opcode=Ma}, - {error,E,Rest}; -decode_error([?ERROR_LENGTH,S1,S0,_,_,_,_,Mi1,Mi0,Ma|D]) -> - {_,Rest} = split_list(21,D), % 21 unused bytes - E = #error{type=idchoice, - seqno=i16(S1,S0), - minor_opcode=i16(Mi1,Mi0), - major_opcode=Ma}, - {error,E,Rest}; -decode_error([?ERROR_REQUEST,S1,S0,_,_,_,_,Mi1,Mi0,Ma|D]) -> - {_,Rest} = split_list(21,D), % 21 unused bytes - E = #error{type=request, - seqno=i16(S1,S0), - minor_opcode=i16(Mi1,Mi0), +decode_error(<<Error,SeqNo:16,BadRes:32,Mi:16,Ma, _:168, Rest/binary>>) -> + E = #error{type=err_type(Error), + seqno=SeqNo, + bad_resource_id=BadRes, + minor_opcode=Mi, major_opcode=Ma}, - {error,E,Rest}; -decode_error([Error|D]) -> - io:format("decode_error(NYI): ~w , ~w ~n",[Error,D]), - {error,#error{type=Error},[]}. + {error,E,Rest}. error_cont(Emsg) -> - #more{cont=fun(More) -> decode_error(Emsg ++ More) end}. + #more{cont=fun(More) -> + decode_error(<<Emsg/binary, More/binary>>) + end}. + +err_type(?ERROR_REQUEST) -> + request; +err_type(?ERROR_VALUE) -> + value; +err_type(?ERROR_WINDOW) -> + window; +err_type(?ERROR_PIXMAP) -> + pixmap; +err_type(?ERROR_ATOM) -> + atom; +err_type(?ERROR_CURSOR) -> + cursor; +err_type(?ERROR_FONT) -> + font; +err_type(?ERROR_MATCH) -> + match; +err_type(?ERROR_DRAWABLE) -> + drawable; +err_type(?ERROR_ACCESS) -> + access; +err_type(?ERROR_ALLOC) -> + alloc; +err_type(?ERROR_COLORMAP) -> + colormap; +err_type(?ERROR_GCONTEXT) -> + gcontext; +err_type(?ERROR_IDCHOICE) -> + idchoice; +err_type(?ERROR_NAME) -> + name; +err_type(?ERROR_LENGTH) -> + length; +err_type(?ERROR_IMPLEMENTATION) -> + implementation; +err_type(_) -> + undefined. %% ------------------------ %% Decoding event messages -decode_event(Event) when length(Event)<32 -> +decode_event(Event) when size(Event)<32 -> event_cont(Event); -decode_event([?EVENT_EXPOSE,_,S1,S0,W3,W2,W1,W0, - X1,X0,Y1,Y0,Wi1,Wi0,H1,H0,C1,C0|D]) -> - {_,Rest} = split_list(14,D), % 14 unused bytes - E = #expose{seqno=i16(S1,S0), - window=i32(W3,W2,W1,W0), - x=i16(X1,X0), - y=i16(Y1,Y0), - width=i16(Wi1,Wi0), - height=i16(H1,H0), - count=i16(C1,C0)}, +decode_event(<<?EVENT_EXPOSE, _, SeqNo:16, + Win:32, + X:16, Y:16, W:16, H:16, C:16, + _:112, Rest/binary>>) -> + E = #expose{seqno=SeqNo, + window=Win, + x=X, + y=Y, + width=W, + height=H, + count=C}, {event,E,Rest}; -decode_event([?EVENT_MAP_NOTIFY,_,S1,S0,E3,E2,E1,E0,W3,W2,W1,W0,V|D]) -> - {_,Rest} = split_list(19,D), % 19 unused bytes - E = #map_notify{seqno=i16(S1,S0), - event=i32(W3,W2,W1,W0), - window=i32(W3,W2,W1,W0), +decode_event(<<?EVENT_MAP_NOTIFY, _, SeqNo:16, + Event:32, Win:32, V, + _:152, Rest/binary>>) -> + E = #map_notify{seqno=SeqNo, + event=Event, + window=Win, override_redirect=V}, {event,E,Rest}; -decode_event([?EVENT_REPARENT_NOTIFY,_,S1,S0,E3,E2,E1,E0,W3,W2,W1,W0, - P3,P2,P1,P0,X1,X0,Y1,Y0,V|D]) -> - {_,Rest} = split_list(11,D), % 11 unused bytes - E = #reparent_notify{seqno=i16(S1,S0), - event=i32(E3,E2,E1,E0), - window=i32(W3,W2,W1,W0), - parent=i32(P3,P2,P1,P0), - x=i16(X1,X0), - y=i16(Y1,Y0), +decode_event(<<?EVENT_REPARENT_NOTIFY, _, SeqNo:16, + Event:32, Win:32, Parent:32, + X:16, Y:16, V, + _:88, Rest/binary>>) -> + E = #reparent_notify{seqno=SeqNo, + event=Event, + window=Win, + parent=Parent, + x=X, + y=Y, override_redirect=V}, {event,E,Rest}; -decode_event([?EVENT_CONFIGURE_NOTIFY,_,S1,S0,E3,E2,E1,E0,W3,W2,W1,W0, - A3,A2,A1,A0,X1,X0,Y1,Y0,Wi1,Wi0,H1,H0,B1,B0,V|D]) -> - {_,Rest} = split_list(5,D), % 5 unused bytes - E = #configure_notify{seqno=i16(S1,S0), - event=i32(E3,E2,E1,E0), - window=i32(W3,W2,W1,W0), - above_sibling=i32(A3,A2,A1,A0), - x=i16(X1,X0), - y=i16(Y1,Y0), - width=i16(Wi1,Wi0), - height=i16(H1,H0), - border_width=i16(B1,B0), +decode_event(<<?EVENT_CONFIGURE_NOTIFY, _, SeqNo:16, + Event:32, Win:32, Above:32, + X:16, Y:16, W:16, H:16, Border:16, V, + _:40, Rest/binary>>) -> + E = #configure_notify{seqno=SeqNo, + event=Event, + window=Win, + above_sibling=Above, + x=X, + y=Y, + width=W, + height=H, + border_width=Border, override_redirect=V}, {event,E,Rest}; -decode_event([Event|D]) -> +decode_event(<<Event, D/binary>>) -> io:format("decode_event(NYI): ~w , ~w~n",[Event,D]), - {event,#event_nyi{event=Event},[]}. + {event,#event_nyi{event=Event},<<>>}. event_cont(Event) -> - #more{cont=fun(More) -> decode_event(Event ++ More) end}. - - + #more{cont=fun(More) -> + decode_event(<<Event/binary, More/binary>>) + end}. %% --------------- %% Misc routines %% --------------- pad(E) -> (4 - (E rem 4)) rem 4. -bpad(E) -> pad(E)*8. rm_pad(0,L) -> L; -rm_pad(1,[_|L]) -> L; -rm_pad(2,[_,_|L]) -> L; -rm_pad(3,[_,_,_|L]) -> L; rm_pad(1,<<_:8, L>>) -> L; rm_pad(2,<<_:16, L>>) -> L; rm_pad(3,<<_:24, L>>) -> L. -add_pad(Data) -> add_pad_0(pad(length(Data))). +add_pad(Data) when binary(Data) -> + add_pad_0(pad(size(Data))); +add_pad(Data) when list(Data) -> + add_pad_0(pad(length(Data))). + +add_pad_0(0) -> <<>>; +add_pad_0(1) -> <<0>>; +add_pad_0(2) -> <<0,0>>; +add_pad_0(3) -> <<0,0,0>>. -add_pad_0(0) -> []; -add_pad_0(1) -> [0]; -add_pad_0(2) -> [0,0]; -add_pad_0(3) -> [0,0,0]. Index: ex11_utils.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/ex11_utils.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ex11_utils.erl 26 Feb 2003 15:25:02 -0000 1.2 +++ ex11_utils.erl 28 Feb 2003 20:31:39 -0000 1.3 @@ -23,7 +23,6 @@ %%% Contributor(s): ______________________________________. %%% %%%--------------------------------------------------------------------- --vc('$Id$ '). -export([first/2,i16/1,i16/2,i32/1,i32/4,split_list/2,get_display/0, b16/2,b32/2,xalloc_id/1]). Index: ex11_xauth.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/ex11_xauth.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ex11_xauth.erl 26 Feb 2003 15:25:02 -0000 1.2 +++ ex11_xauth.erl 28 Feb 2003 20:31:39 -0000 1.3 @@ -27,7 +27,6 @@ %%% To make it work under Windows. Added filename/0. %%% %%%--------------------------------------------------------------------- --vc('$Id$ '). -export([read/1,host2cookie/2,filename/0]). -import(ex11_utils,[first/2,i16/2,split_list/2]). Index: matrix44.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/matrix44.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- matrix44.erl 26 Feb 2003 15:25:02 -0000 1.2 +++ matrix44.erl 28 Feb 2003 20:31:39 -0000 1.3 @@ -43,7 +43,6 @@ %% represents the given point specified by X,Y,Z . %% %% --------------------------------------------------------------------- --vc('$Id$ '). -export([start/0,multiply44/2,multiply14/2,mk_projection_matrix/1, mk_rotate_matrix/2,mk_scale_matrix/3,mk_hcord/3, mk_translate_matrix/3]). Index: rcube.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/ex11/src/rcube.erl,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- rcube.erl 26 Feb 2003 15:25:02 -0000 1.2 +++ rcube.erl 28 Feb 2003 20:31:40 -0000 1.3 @@ -17,7 +17,6 @@ %%% Transformed again to use the Erlang X11 binding. %%% %%% -------------------------------------------------------------------- --vc('$Id$ '). -export([start/0, start/1,init/1,kicker/2]). -import(matrix44,[multiply14/2,mk_rotate_matrix/2,mk_hcord/3, @@ -47,6 +46,7 @@ Fig = figure(), Object = draw_cube(X,Rcube,Fig), Kicker = start_kicker(?KICK_INTERVAL), + timer:sleep(1000), loop(X,Rcube,Fig,Kicker). init_xyz() -> @@ -277,6 +277,7 @@ value_mask = Wmask, value_list = Wval }), +io:format("PIX=~w~n", [Window]), %% %% Create the Pixmap %% |
From: <ma...@us...> - 2003-02-28 16:00:30
|
Update of /cvsroot/jungerl/jungerl/lib/pan/bin In directory sc8-pr-cvs1:/tmp/cvs-serv8590/bin Modified Files: pan Log Message: jungerlified Index: pan =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/pan/bin/pan,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- pan 28 Feb 2003 14:57:45 -0000 1.1.1.1 +++ pan 28 Feb 2003 16:00:24 -0000 1.2 @@ -1,6 +1,5 @@ #! /bin/tcsh -f -setenv OTP_ROOT /EDUP/Erlang/R8B-2 setenv PATH "$OTP_ROOT/bin:"$PATH set SELF_PATH = `which $0` @@ -13,14 +12,14 @@ set SELF_PATH = $SELF_PATH:h endif -set SNAME = `echo $SELF_PATH:t | sed "s/\.//g" | sed "s/-/_/g"` +set SNAME = pan set U1 = "usage: $0 [-setcookie <cookie>] [-nocookie]" set U2 = "[-pa <path>] [-tick <netticktime>] [-name <node name>] [-spawn]" set usage = "$U1 $U2" set xpat -set tick = "-kernel net_ticktime 8" -set cookie = "-setcookie nc1" +set tick = "" +set cookie = "" while ($#argv) switch ($1) case "-help": |
From: <ma...@us...> - 2003-02-28 15:50:12
|
Update of /cvsroot/jungerl/jungerl/lib/pan/ebin In directory sc8-pr-cvs1:/tmp/cvs-serv3968/ebin Log Message: Directory /cvsroot/jungerl/jungerl/lib/pan/ebin added to the repository |
From: <ma...@us...> - 2003-02-28 15:49:52
|
Update of /cvsroot/jungerl/jungerl/lib/pan In directory sc8-pr-cvs1:/tmp/cvs-serv3776 Modified Files: Makefile Log Message: jungerlified Index: Makefile =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/pan/Makefile,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- Makefile 28 Feb 2003 14:57:45 -0000 1.1.1.1 +++ Makefile 28 Feb 2003 15:49:44 -0000 1.2 @@ -1,10 +1,16 @@ ERLC = /EDUP/Erlang/R7B-4/bin/erlc EFLAGS = -W +debug_info -ERLS = $(shell echo *.erl) -BEAMS = $(patsubst %.erl, %.beam, $(ERLS)) +ERLS = $(shell echo src/*.erl) +BEAMS = $(patsubst src/%.erl, ebin/%.beam, $(ERLS)) -default:$(BEAMS) -%.beam: %.erl - $(ERLC) $(EFLAGS) $< + +ebin/%.beam: src/%.erl + $(ERLC) -o ebin -I inc $(EFLAGS) $< + +default: all +all: $(BEAMS) + +clean: + rm $(BEAMS) |
From: <lu...@us...> - 2003-02-27 17:28:13
|
Update of /cvsroot/jungerl/jungerl/config In directory sc8-pr-cvs1:/tmp/cvs-serv21605 Modified Files: Makefile Log Message: Added 'chmod +x' on the jerl script. Not sure that this Makefile is entirely canonical :-) Index: Makefile =================================================================== RCS file: /cvsroot/jungerl/jungerl/config/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Makefile 25 Feb 2003 14:08:47 -0000 1.3 +++ Makefile 27 Feb 2003 17:28:00 -0000 1.4 @@ -5,6 +5,7 @@ config.status: configure ./configure + chmod +x $(JERL) $(JERL) $(MK_INCLUDE): config.status ../support/include.mk.in ../bin/jerl.in ./config.status |
From: <lu...@us...> - 2003-02-27 01:10:42
|
Update of /cvsroot/jungerl/jungerl/lib/msc/src In directory sc8-pr-cvs1:/tmp/cvs-serv2317 Modified Files: fdoc.erl Log Message: Added a FIXME: comments_to_doc([]) -> %% FIXME: we should really generate nothing here, since zillions %% of these "undocumented" strings will match e.g. an apropos %% search for "documented" :-) -luke "(undocumented)\n"; Index: fdoc.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/msc/src/fdoc.erl,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- fdoc.erl 26 Feb 2003 22:09:45 -0000 1.1 +++ fdoc.erl 27 Feb 2003 01:10:37 -0000 1.2 @@ -271,6 +271,9 @@ S1. comments_to_doc([]) -> + %% FIXME: we should really generate nothing here, since zillions + %% of these "undocumented" strings will match e.g. an apropos + %% search for "documented" :-) -luke "(undocumented)\n"; comments_to_doc(Comments) -> flatten([Line || Line <- map(fun clean_comment/1, Comments), |
From: <lu...@us...> - 2003-02-26 22:10:52
|
Update of /cvsroot/jungerl/CVSROOT In directory sc8-pr-cvs1:/tmp/cvs-serv25070 Modified Files: loginfo Log Message: *** empty log message *** Index: loginfo =================================================================== RCS file: /cvsroot/jungerl/CVSROOT/loginfo,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- loginfo 26 Feb 2003 18:25:45 -0000 1.3 +++ loginfo 26 Feb 2003 22:10:16 -0000 1.4 @@ -26,4 +26,4 @@ #DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog # Send commit emails to the jungerl-commit list -DEFAULT /cvsroot/sitedocs/CVSROOT/cvstools/syncmail -C 3 -u %{sVv} jun...@li... +DEFAULT /cvsroot/sitedocs/CVSROOT/cvstools/syncmail -q -C 3 -u %{sVv} jun...@li... |
From: <lu...@us...> - 2003-02-26 22:09:50
|
Update of /cvsroot/jungerl/jungerl/lib/msc/src In directory sc8-pr-cvs1:/tmp/cvs-serv24810/lib/msc/src Added Files: fdoc.erl Log Message: fdoc: a poor-man's edoc. --- NEW FILE: fdoc.erl --- %%%---------------------------------------------------------------------- %%% File : fdoc.erl %%% Author : Luke Gorrie <lu...@bl...> %%% Purpose : Heuristic sourcecode documentation extractor %%% (A poor man's 'edoc') %%% Created : 26 Feb 2003 by Luke Gorrie <lu...@bl...> %%%---------------------------------------------------------------------- -module(fdoc). -author('lu...@bl...'). -import(lists, [reverse/1, splitwith/2, takewhile/2, flatten/1, map/2, foreach/2, member/2, sort/1, any/2]). %% Server-based interface -export([apropos/1, describe/1, describe/2, describe/3, stop/0]). %% Function-based interface -export([describe_file/1, file/1, string/1]). %% Internal server exports -export([init/0,loop/0]). %% ---------------------------------------------------------------------- %% Server half. Calling these functions causes a server to be created, %% which scans the sources for all loaded modules. You can use stop() %% to shut it dow, so that the next request will rebuild the database. %% ---------------------------------------------------------------------- %% Interface %% Print apropos information by regexp. apropos(Regexp) -> ensure_started(), case regexp:parse(Regexp) of {ok, RE} -> fdoc ! {apropos, self(), RE}, receive {apropos, Matches} -> print_matches(Matches) end; Err -> Err end. %% Print a description of all functions matching Module, Function, and %% Arity. Function and module arguments are optional. describe(Module) -> describe(Module, '_', '_'). describe(Module, Function) -> describe(Module, Function, '_'). describe(Module, Function, Arity) -> ensure_started(), fdoc ! {describe, self(), Module, Function, Arity}, receive {describe, Matches} -> print_matches(Matches) end. %% Stop the fdoc server. You can use this to flush the database. stop() -> catch (fdoc ! stop), ok. %% Internals print_matches(Ms) -> foreach(fun({Mod, Fn, Arity, Doc}) -> io:format("~p:~p/~p:~n~s~n", [Mod, Fn, Arity, indent(Doc, " ")]) end, sort(Ms)). %% Ensure that the 'fdoc' server has started. ensure_started() -> case whereis(?MODULE) of undefined -> Pid = proc_lib:spawn(?MODULE, init, []), register(?MODULE, Pid), {ok, Pid}; Pid -> {ok, Pid} end. init() -> init_db(), loop(). init_db() -> ets:new(?MODULE, [public, bag, named_table]), foreach(fun import_module/1, [M || {M, _Objfile} <- code:all_loaded()]). loop() -> receive stop -> ok; {apropos, From, RE} -> Matches = [{M,F,A,D} || {M,F,A,D} <- ets:tab2list(?MODULE), any(fun(S) -> regexp:match(S, RE) /= nomatch end, [D, atom_to_list(M), atom_to_list(F)])], From ! {apropos, Matches}, ?MODULE:loop(); {describe, From, M, F, A} -> case code:is_loaded(M) of false -> %% Have to reload the database first.. code:ensure_loaded(M), ets:delete(?MODULE), init_db(); _ -> ok end, From ! {describe, ets:match_object(?MODULE, {M, F, A, '_'})}, ?MODULE:loop() end. import_module(Mod) -> case catch filename:find_src(Mod) of {error, _} -> skipped; {'EXIT', _} -> skipped; {Sourcefile0, _} -> Sourcefile = Sourcefile0 ++ ".erl", case file(Sourcefile) of {ok, Docs} -> foreach(fun({Fn, Arity, DocStr}) -> ets:insert(?MODULE,{Mod,Fn,Arity,DocStr}) end, just_exports(Mod, Docs)); {error, Reason} -> skipped end end. just_exports(Mod, Docs) -> [{F,A,D} || {F,A,D} <- Docs, member({F, A}, Mod:module_info(exports))]. %% ---------------------------------------------------------------------- %% Function half, for extracting documentation from files and strings. %% ---------------------------------------------------------------------- %% Interface %% Print a description of all the documented exported functions in a %% file. describe_file(Name) -> case file(Name) of {ok, Docs} -> foreach(fun({Fn, Arity, Doc}) -> io:format("~p/~p:~n~s~n", [Fn, Arity, indent(Doc, " ")]) end, Docs); {error, Rsn} -> {error, Rsn} end. %% Return a description of all documented exported functions in %% a file. %% Returns: {Function, Arity, Documentation} file(Name) -> case file:read_file(Name) of {ok, Bin} -> {ok, string(binary_to_list(Bin))}; {error, Reason} -> {error, Reason} end. %% Return a description of all documented exported functions in %% a string. %% Returns: {Function, Arity, Documentation} string(S) -> remove_dups(scan_lines(S, [])). %% Internals %% If we have multiple definitions of the same function/arity, just %% keep the first one. remove_dups([{F,A,Doc}, {F,A,_} | T]) -> remove_dups([{F,A,Doc}|T]); remove_dups([H|T]) -> [H|remove_dups(T)]; remove_dups([]) -> []. scan_lines([], _) -> []; scan_lines(S0, Acc) when hd(S0) == $% -> {CommentLine, S1} = take_line(S0), scan_lines(S1, [CommentLine|Acc]); scan_lines("\n"++S, Acc) when hd(S) == $% -> %% Blank followed by a new comment: flush old comment scan_lines(S, []); scan_lines("\n"++S, Acc) -> %% Blank not followed by a comment: keep the current comment scan_lines(S, Acc); scan_lines(S0, Acc) -> case function_start_char(hd(S0)) of true -> scan_function(S0, comments_to_doc(reverse(Acc))); false -> scan_lines(drop_line(S0), []) end. scan_function(S0, Comments) -> case take_function_head(S0) of {ok, Head, S1} -> S2 = drop_line(S1), % skip to next fresh line case parse_function_head(Head) of {ok, Function, Arity} -> [{Function, Arity, Comments} | scan_lines(S2, [])]; error -> scan_lines(S2, []) end; eos -> [] end. function_start_char(Ch) when Ch >= $a, Ch =< $z -> true; function_start_char(Ch) when Ch >= $A, Ch =< $Z -> true; function_start_char($') -> true; function_start_char(_) -> false. %% Parse a function head into name and arity. %% Returns: {ok, Name, Arity} | error parse_function_head(S0) -> %% Poor man's approach: rewind back to the closing ')', tack on a %% '.', and see if we can parse it as a function call. S1 = takewhile(fun(Ch) -> Ch /= $) end, S0) ++ ").", case erl_scan:string(S1) of {ok, Scan, _} -> case erl_parse:parse_exprs(Scan) of {ok, [{call,_,{atom,_,Fname},Args}]} -> {ok, Fname, length(Args)}; _ -> error end; _ -> error end. %% Keep going until we see a "->". FIXME, should be clever about "->" %% appearing inside comments, atoms, or strings. take_function_head(S) -> take_function_head(S, []). take_function_head("->"++S, Acc) -> {ok, reverse(Acc), S}; take_function_head("%"++S0, Acc) -> {_, S1} = take_line(S0), take_function_head(S1, Acc); take_function_head([H|T], Acc) -> take_function_head(T, [H|Acc]); take_function_head([], _Acc) -> eos. %% Returns: {Line, Rest} take_line(S) -> take_line(S, []). take_line([], Acc) -> {reverse(Acc), []}; take_line([$\n|S], Acc) -> {reverse("\n"++Acc), S}; take_line([H|T], Acc) -> take_line(T, [H|Acc]). drop_line(S0) -> {_, S1} = take_line(S0), S1. comments_to_doc([]) -> "(undocumented)\n"; comments_to_doc(Comments) -> flatten([Line || Line <- map(fun clean_comment/1, Comments), not boring_comment(Line)]). boring_comment("\n") -> true; boring_comment(S) -> %% Matches "%% ----------" lines lists:all(fun(Ch) -> Ch == $- end, S -- "\n"). clean_comment("% "++S) -> S; clean_comment("%"++S) -> clean_comment(S); clean_comment(S) -> S. indent(S, Pad) -> flatten([Pad | indent1(S, Pad)]). indent1("\n"++S, Pad) -> ["\n", Pad, indent1(S, Pad)]; indent1([H|T], Pad) -> [H|indent1(T, Pad)]; indent1([], _) -> []. |
From: <lu...@us...> - 2003-02-26 18:29:34
|
Update of /cvsroot/jungerl/jungerl/lib/tuntap/src In directory sc8-pr-cvs1:/tmp/cvs-serv15655 Modified Files: tuntap.erl Log Message: Removed 'export_all' Index: tuntap.erl =================================================================== RCS file: /cvsroot/jungerl/jungerl/lib/tuntap/src/tuntap.erl,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- tuntap.erl 20 Feb 2003 23:52:55 -0000 1.1 +++ tuntap.erl 26 Feb 2003 18:29:28 -0000 1.2 @@ -14,8 +14,6 @@ open_tun/0, open_tap/0, open_tuntap/2, device_name/1, write/2]). --compile(export_all). - -define(REPLY_ERROR, 0). -define(REPLY_OK, 1). |
From: <lu...@us...> - 2003-02-26 18:26:21
|
Update of /cvsroot/jungerl/CVSROOT In directory sc8-pr-cvs1:/tmp/cvs-serv13227 Modified Files: loginfo Log Message: Now using unidiffs with 3 lines of context. Index: loginfo =================================================================== RCS file: /cvsroot/jungerl/CVSROOT/loginfo,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** loginfo 26 Feb 2003 11:55:54 -0000 1.2 --- loginfo 26 Feb 2003 18:25:45 -0000 1.3 *************** *** 27,29 **** # Send commit emails to the jungerl-commit list ! DEFAULT /cvsroot/sitedocs/CVSROOT/cvstools/syncmail %{sVv} jun...@li... --- 27,29 ---- # Send commit emails to the jungerl-commit list ! DEFAULT /cvsroot/sitedocs/CVSROOT/cvstools/syncmail -C 3 -u %{sVv} jun...@li... |