diff options
author | Richard Nelson <cowboy@debian.org> | 1998-06-23 10:00:00 -0500 |
---|---|---|
committer | Andreas Beckmann <debian@abeckmann.de> | 2012-10-01 19:58:37 +0200 |
commit | 6202a816311c5e56f71ecd358850b1e6d8cd7065 (patch) | |
tree | de47ad4f657df101b6f36a07a6c6e19191be7de9 /mmuegel/libs/strings1.pl | |
parent | 6c193ce1dd1d07ebdc1372e38bc4908ab1c37705 (diff) | |
download | sendmail-debian/8.8.8-20.tar.gz |
Imported Debian patch 8.8.8-20debian/8.8.8-20
Diffstat (limited to 'mmuegel/libs/strings1.pl')
-rw-r--r-- | mmuegel/libs/strings1.pl | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/mmuegel/libs/strings1.pl b/mmuegel/libs/strings1.pl new file mode 100644 index 0000000..a49335a --- /dev/null +++ b/mmuegel/libs/strings1.pl @@ -0,0 +1,147 @@ +;# NAME +;# strings1.pl - FUN with strings #1 +;# +;# NOTES +;# I wrote Format_Text_Block when I just started programming Perl so +;# it is probably not very Perlish code. Center is more like it :-). +;# +;# AUTHOR +;# Michael S. Muegel (mmuegel@mot.com) +;# +;# RCS INFORMATION +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/strings1.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp + +package strings1; + +;###############################################################################;# Center +;# +;# Center $Text assuming the output should be $Columns wide. $Text can span +;# multiple lines, of course :-). Lines within $Text that contain only +;# whitespace are not centered and are instead collapsed. This may save time +;# when printing them later. +;# +;# Arguments: +;# $Text, $Columns +;# +;# Returns: +;# $Centered_Text +;############################################################################### +sub main'Center +{ + local ($_, $Columns) = @_; + local ($*) = 1; + + s@^(.*)$@" " x (($Columns - length ($1)) / 2) . $1@eg; + s/^[\t ]*$//g; + return ($_); +}; + +;############################################################################### +;# Format_Text_Block +;# +;# Formats a text string to be printed to the display or other similar device. +;# Text in $String will be fomratted such that the following hold: +;# +;# + $String contains the (possibly) multi-line text to print. It is +;# automatically word-wrapped to fit in $Columns. +;# +;# + \n'd are maintained and are not folded. +;# +;# + $Offset is pre-pended before each separate line of text. +;# +;# + If $Offset_Once is $TRUE $Offset will only appear on the first line. +;# All other lines will be indented to match the amount of whitespace of +;# $Offset. +;# +;# + If $Bullet_Indent is $TRUE $Offset will only be applied to the begining +;# of lines as they occured in the original $String. Lines that are created +;# by this routine will always be indented by blank spaces. +;# +;# + If $Columns is 0 no word-wrap is done. This might be useful to still +;# to offset each line in a buffer. +;# +;# + If $Split_Expr is supplied the string is split on it. If not supplied +;# the string is split on " \t\/\-\,\." by default. +;# +;# + If $Offset_Blank is $TRUE then empty lines will have $Offset pre-pended +;# to them. Otherwise, they will still empty. +;# +;# This is a realy workhorse routine that I use in many places because of its +;# veratility. +;# +;# Arguments: +;# $String, $Offset, $Offset_Once, $Bullet_Indent, $Columns, $Split_Expr, +;# $Offset_Blank +;# +;# Returns: +;# $Buffer +;############################################################################### +sub main'Format_Text_Block +{ + local ($String, $Real_Offset, $Offset_Once, $Bullet_Indent, $Columns, + $Split_Expr, $Offset_Blank) = @_; + + local ($New_Line, $Line, $Chars_Per_Line, $Space_Offset, $Buffer, + $Next_New_Line, $Num_Lines, $Num_Offsets, $Offset); + local ($*) = 0; + local ($BLANK_TAG) = "__FORMAT_BLANK__"; + local ($Blank_Offset) = $Real_Offset if ($Offset_Blank); + + # What should we split on? + $Split_Expr = " \\t\\/\\-\\,\\." if (! $Split_Expr); + + # Pre-process the string - convert blank lines to __FORMAT_BLANK__ sequence + $String =~ s/\n\n/\n$BLANK_TAG\n/g; + $String =~ s/^\n/$BLANK_TAG\n/g; + $String =~ s/\n$/\n$BLANK_TAG/g; + + # If bad $Columns/$Offset combo or no $Columns make a VERRRYYY wide $Column + $Offset = $Real_Offset; + $Chars_Per_Line = 16000 if (($Chars_Per_Line = $Columns - length ($Offset)) <= 0); + $Space_Offset = " " x length ($Offset); + + # Get a buffer + foreach $Line (split ("\n", $String)) + { + $Offset = $Real_Offset if ($Bullet_Indent); + + # Find where to split the line + if ($Line ne $BLANK_TAG) + { + $New_Line = ""; + while ($Line =~ /^([$Split_Expr]*)([^$Split_Expr]+)/) + { + if (length ("$New_Line$&") >= $Chars_Per_Line) + { + $Next_New_Line = $+; + $New_Line = "$Offset$New_Line$1"; + $Buffer .= "\n" if ($Num_Lines++); + $Buffer .= $New_Line; + $Offset = $Space_Offset if (($Offset) && ($Offset_Once)); + $New_Line = $Next_New_Line; + ++$Num_Lines; + } + else + { + $New_Line .= $&; + }; + $Line = $'; + }; + + $Buffer .= "\n" if ($Num_Lines++); + $Buffer .= "$Offset$New_Line$Line"; + $Offset = $Space_Offset if (($Offset) && ($Offset_Once)); + } + + else + { + $Buffer .= "\n$Blank_Offset"; + }; + }; + + return ($Buffer); + +}; + +1; |