<< Prev | - Up - |
Suppose we want to read a file, expand all TAB characters to space characters, and write the expanded lines to another file. The program which implements this task is shown in Program 3.1.
local
fun {Insert N Is}
if N>0 then {Insert N-1 & |Is} else Is end
end
fun {Scan Is Tab N}
case Is of nil then nil
[] I|Ir then
case I
of &\t then M=Tab-(N mod Tab) in {Insert M {Scan Ir Tab M+N}}
[] &\n then I|{Scan Ir Tab 0}
[] &\b then I|{Scan Ir Tab {Max 0 N-1}}
else I|{Scan Ir Tab N+1}
end
end
end
in
proc {Expand Tab IN ON}
IF={New Open.file init(name:IN)}
OF={New Open.file init(name:ON flags:[write create truncate])}
Is
in
{IF read(list:Is size:all)} {IF close}
{OF write(vs:{Scan Is Tab 0})} {OF close}
end
end
The file with name IN
is opened for reading. After reading the entire file into the list Is
, the file and the associated object are closed. Remember that reading the entire file is obtained by giving all
as the value for feature size
.
The expansion of TAB characters is done in the function Scan
. It takes as input parameters the list of characters Is
, the Tab
, and the current position N
in the current line.
The outer case
of Scan
figures out whether there are characters to process. If the next character to process is a TAB character, enough space characters to reach the next multiple of TabStop
are inserted. This is performed by the self explanatory function Insert
.
A newline character resets the position N
to zero. The position is decremented whenever a backspace character is encountered. Any other character increments the position.
A second file is opened for writing (indicated by write
). If a file with name ON
does not exist, it is created (indicated by create
). Otherwise the already existing file is truncated to length zero (indicated by truncate
) and rewritten. The expanded string is written to this file.
The file and its associated file object are closed after writing the expanded list of characters to it.
<< Prev | - Up - |