home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Programming
/
sofa
/
archive
/
SmallEiffel.lha
/
SmallEiffel
/
contrib
/
lib
/
string_formatter.e
< prev
Wrap
Text File
|
1999-06-05
|
3KB
|
120 lines
-- This file is free software, which comes along with SmallEiffel. This
-- software is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
-- this header is kept unaltered, and a notification of the changes is added.
-- You are allowed to redistribute it and sell it, alone or as a part of
-- another product.
--
-- This file is copyrighted and maintained by P.M. Hegt
-- E-mail: p_m_hegt@hotmail.com
--
indexing
description: "String formatter."
author: "P.M. Hegt (mailto: p_m_hegt@hotmail.com)"
copyright: "Freeware. No warranty."
note: "This is a simple string formatter because there is only a limited number of arguments possible."
how_to_use: "You can use facility inheritance or a client relation. %
% In case of facility inheritance, inherit STRING_FORMATTER %
% and call function `format_string': %
% my_feature is %
% local %
% s: STRING %
% do %
% s := format_string ("1 = '~1', 2 = '~2', 1 = '~1'." , << "A", "B">>) %
% print (s); io.put_new_line %
% end %
% %
% produces the following output: %
% 1 = 'A', 2 = 'B', 1 = 'A'. %
% %
% In case of a client relation, create an instance first %
% and call function `format_string': %
% my_feature is %
% local %
% sf: STRING_FORMATTER
% s: STRING %
% do %
% !! sf
% s := sf.format_string ("1 = '~1', 2 = '~2', 1 = '~1'." , << "A", "B">>) %
% print (s); io.put_new_line %
% end %
% produces identical output. %
"
class
STRING_FORMATTER
feature -- Formatting
format_string (format: STRING; arguments: COLLECTION[STRING]): STRING is
-- Format string.
-- `Result' is a copy of `format' where substring
-- "~1" is replaced with `arguments' @ 1, etc.
-- Max 9 arguments if arguments.lower = 1.
-- Max 10 arguments if arguments.lower = 0.
require
format /= Void
arguments /= Void
arguments.lower <= 1
arguments.count <= 9
local
i: INTEGER
c: CHARACTER
j: INTEGER
do
from
!! Result.make (50)
i := 1
invariant
(1 <= i) and (i <= 1 + format.count)
variant
format.count - i
until
not (i <= format.count)
loop
c := format @ i
if c = argument_indicator then
if i < format.count then
i := i + 1
c := format @ i
if c.is_digit then
j := c.code - ('0').code
if arguments.lower <= j and j <= arguments.upper then
Result.append_string (arguments @ j)
else
-- Argument not present
Result.append_character (argument_indicator)
Result.append_character (c)
end
else
-- Is not an argument.
Result.append_character (argument_indicator)
Result.append_character (c)
end
else
-- c is last character so cannot be an argument.
Result.append_character (c)
end
else
Result.append_character (c)
end
i := i + 1
end
ensure
Result /= Void
end
feature -- Constants
argument_indicator: CHARACTER is '~'
end -- class STRING_FORMATTER