break_string()
==============

FUNKTION
--------
::

    string break_string(string str)
    string break_string(string str, int width)
    string break_string(string str, int width, string indent)
    string break_string(string str, int width, int space)
    string break_string(string str, int width, string indent, int flags)
    string break_string(string str, int width, int space, int flags)

ARGUMENTE
---------
::

    str    - umzubrechender String
    width  - optional: maximale Zeilenlaenge (default 78)
    indent - optional: String, der vor jeder umgebrochenen Zeile erscheint
    space  - optional: Anzahl der Leerzeichen vor jeder umgebrochenen Zeile
    flags  - optional: hiermit laesst sich das Verhalten von break_string()
             aendern; moegliche Flags siehe Punkt 'Beschreibung'

BESCHREIBUNG
------------
::

    In der ersten Form wird der String 'str' durch Einfuegen von "\n" so um-
    gebrochen, dass bei einer anschliessenden Ausgabe keine Zeile laenger
    als 'width' Zeichen ist. Eventuell schon in 'str' vorhandene "\n" werden
    dabei vorher entfernt.

    Gibt man zusaetzlich noch einen String 'indent' an, so wird dieser vor
    jede der umgebrochenen Zeilen gesetzt.

    Analog wird bei der Angabe der Zahl 'space' ein String mit 'space' Leer-
    zeichen vor jede umgebrochene Zeile gesetzt.

    Zusaetzlich gibt es folgende optionale Flags, die man beliebig kombinieren
    kann:

        BS_LEAVE_MY_LFS  -  schon im Text vorhandene "\n" werden beibehalten
        BS_SINGLE_SPACE  -  doppelte Leerzeichen sowie Leerzeichen nach Zeilen-
                            umbruechen werden entfernt
        BS_BLOCK         -  der Text wird im Blocksatz formatiert
        BS_NO_PARINDENT  -  bei Blocksatz mit vorgegebenen Zeilenumbruechen
                            (BS_BLOCK|BS_LEAVE_MY_LFS) werden Zeilen nach "\n"
                            normalerweise mit einem Leerzeichen begonnen.
                            Um das Einfuegen des fuehrenden Leerzeichens zu
                            unterdruecken, muss BS_NO_PARINDENT angegeben werden
        BS_INDENT_ONCE   -  die erste Zeile des Textes wird mit vorangestelltem
                            'indent' ausgegeben; alle folgenden Zeilen bekommen
                            einen Leerstring vorangestellt
        BS_PREPEND_INDENT - der Ident wird dem Text vorangestellt sofern der 
                            Indent + Text laenger als eine Zeile ist. Der Text
			    wird um ein Leerzeichen eingerueckt, was mittels
                            BS_NO_PARINDENT verhindert werden kann.

RUECKGABEWERT
-------------
::

    Der umgebrochene Text.

    Laufzeit-Fehler, wenn der Indent laenger ist als die vorgegebene Breite.

BEISPIELE
---------
::

    write(break_string("Dies ist ein laengerer Text. Nur so als Beispiel.",27));

        => Dies ist ein laengerer
           Text. Nur so als Beispiel.

    write(break_string("Mit indent sieht das so aus", 30, "Wargon sagt: "));

        => Wargon sagt: Mit indent sieht
           Wargon sagt: das so aus

    write(break_string("Mit indent sieht das so aus", 30, "Wargon sagt: ",
                        BS_INDENT_ONCE));

        => Wargon sagt: Mit indent sieht
                        das so aus

    write(break_string("Mit Leerzeichen sieht das so aus", 30, 2));

        =>   Mit Leerzeichen sieht das so
             aus...

    write(break_string("Ich will es\naber vorformatiert!",60,
                        "Wargon sagt: ", BS_LEAVE_MY_LFS));

        => Wargon sagt: Ich will es
           Wargon sagt: aber vorformatiert!

    write(break_string("Ich will es\naber vorformatiert!",30,
                        "Wargon sagt: ", BS_PREPEND_INDENT));

        => Wargon sagt:
            Ich will es aber 
            vorformatiert!

SIEHE AUCH
----------
::

    senderwiederholung

