aboutsummaryrefslogtreecommitdiffstats
path: root/lib/pman/src/pman_buf_buffer.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pman/src/pman_buf_buffer.erl')
-rw-r--r--lib/pman/src/pman_buf_buffer.erl102
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/pman/src/pman_buf_buffer.erl b/lib/pman/src/pman_buf_buffer.erl
new file mode 100644
index 0000000000..ad92eb1f3e
--- /dev/null
+++ b/lib/pman/src/pman_buf_buffer.erl
@@ -0,0 +1,102 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%%----------------------------------------------------------------------
+%%% Purpose : The purpouse of the buffer process is to take
+%%% care of the data that is received by the converter
+%%% process and pass it on to the printer process in chunks
+%%% that can be handled.
+%%%
+%%% This module is a part of the buffering system, and
+%%% should not be used except through the API defined
+%%% in the pman_buf module.
+%%%
+%%%----------------------------------------------------------------------
+
+-module(pman_buf_buffer).
+
+%%-compile(export_all).
+-export([init/1]).
+
+-include("pman_buf.hrl").
+
+
+
+%%
+%% Initialization function for the buffer process.
+%% To be started with spawn from the calling process.
+%%
+
+init(Editor) ->
+ Printer_pid = spawn_link(pman_buf_printer,init,[Editor,self()]),
+ receive
+ {converter_pid,Pid} ->
+ Pid!{buffer,accept},
+ buffer_loop([],0,0,Printer_pid,Pid)
+ end.
+
+
+
+%%
+%% Receive loop for the buffer process.
+%%
+
+buffer_loop(Buffer,Size,Acc,Printer,Converter) ->
+ receive
+ {save_buffer,Name} ->
+ Printer!{save_buffer,Name},
+ buffer_loop(Buffer,Size,Acc,Printer,Converter);
+ {raw,Raw,Length} -> %%output to editor
+ New_Size = Size + Length,
+ if New_Size < ?BUFF_SIZE ->
+ Converter!{buffer,accept};
+ true -> ok
+ end,
+ Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
+ New_Buff = lists:append(Buffer,Print),
+ buffer_loop(New_Buff,New_Size,Acc,Printer,Converter);
+ {clear,Text,N_Converter} ->
+ Converter!{buffer,accept},
+ Printer!clear,
+ buffer_loop([Text],1,1,Printer,N_Converter);
+ {printer,send} when Buffer /= [] ->
+ if
+ Acc > ?EDITOR_MAX ->
+ Printer!clear,
+ Printer !{buffer,"Cleared Buffer due to Size\n\n"},
+ buffer_loop(Buffer,Size,1,Printer,Converter);
+ true ->
+ {Length,Rest,Print} = pman_buf_utils:split(Buffer,
+ ?PRINT_LEN,
+ 0,
+ []),
+ Printer ! {buffer,Print},
+ New_Size = Size - Length,
+ if New_Size < ?BUFF_SIZE ->
+ Converter!{buffer,accept};
+ true -> ok
+ end,
+ buffer_loop(Rest,New_Size,Acc+Length,Printer,Converter)
+ end;
+ {converter,file} ->
+ Converter!{buffer,Buffer},
+ self()!{raw,[to_file],1},
+ buffer_loop([],0,Acc,Printer,Converter)
+ end.
+
+