diff options
Diffstat (limited to 'lib/pman/src/pman_buf_buffer.erl')
-rw-r--r-- | lib/pman/src/pman_buf_buffer.erl | 102 |
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. + + |