Posted on Wednesday, January 02, 2008 at 2:43 AM
Here, for completeness without further comment, is the code for
RTrim,
LTrim and
Trim which are included in the unit
Tools.
Function RTrim (Var S : String) : String ;
{
RTrim -- remove trailing blanks
}
Var
i : Byte ;
begin { RTrim }
for i := Length(S) downto 1 do
if S[i] > BLANK then begin
S := Copy(S,1,i) ;
RTrim := S ;
Exit
end ;
{
if we reach this point then S contains only BLANKS
so we return a null string
}
S := '' ;
RTrim := S
end ; { RTrim }
Function LTrim (Var S : String) : String ;
{
LTrim -- remove leading blanks
}
Var
i : Byte ;
begin { LTrim }
for i := 1 to Length(S) do
if S[i] > BLANK then begin
S := Copy(S,i,MAXSTR) ;...
DeTab is the inverse of EnTab. Here is the specification:
{
PROGRAM
DeTab -- convert tabs to blanks
USAGE
DeTab
FUNCTION
DeTab copies its input to its output, expanding horizontal tabs to
blanks along the way, so that the output is visually the same as the
input, but contains no tab chars. Tab stops are assumed to be set
every three columns (i.e., 1, 4, 7, 10, ...), so that each tab char
is replaced by from one to three blanks.
BUGS
1. DeTab is naive about backspace, vertical motions, and
non-printing chars.
2. Each line of output will be truncated at MAXSTR chars.
3. Trailing BLANKS will be trimmed from each line of output.
}
DeTab's main routine echos EnTab's, reducing the problem to one of detabbing a single string. To detab the string we could try to simply apply EnTab's strategy in reverse, however, this is another chance to apply the "how would a human do it?" approach...