SYNOPSIS
        #include <sys/input_to.h>

        void input_to(string|closure fun);
        void input_to(string|closure fun, int flag, ...);
        void input_to(string|closure fun, int flag, string|closure prompt, ...);

BESCHREIBUNG
        Die naechste Zeile, die der Spieler eintippt, wird als Argument an die
        Funktion <fun> uebergeben. Ausnahme: wenn die naechste Zeile mit einem
        '!' beginnt, wird sie als Kommando ausgewertet bzw. an das letzte
        input_to() uebergeben, das das INPUT_IGNORE_BANG Flag gesetzt hat.
        Die Funktion <fun> kann "static" deklariert sein, nicht aber "private"
        (sonst wird sie nicht gefunden).

        Der Aufruf von <fun> erfolgt nicht sofort, sondern erst, wenn der
        Spieler die Entertaste drueckt.

        Wenn input_to() mehr als einmal pro Funktion aufgerufen wird,
        wird normalerweise nur das erste input_to() beruecksichtigt.
        Diese Verhalten kann durch die Angabe von INPUT_APPEND
        modifiziert werden: in diesem Fall wird das input_to() an die
        Liste der bereits anhaengigen input_tos angehaengt (siehe
        BEISPIELE).

        Wird andererseits waehrend einem laufenden input_to() (mittels "!" am
        Zeilenanfang) eine neue Funktion aufgerufen, die wiederum ein
        input_to() enthaelt, wird das urspruengliche input_to() so lange
        unterbrochen, bis das neue input_to() abgearbeitet wurde,
        anschliessend wird es wieder aktiv.

        Das optionale <flag> kann ein binaeres Oder (|) der folgenden
        Werte sein:

        INPUT_NOECHO (1):
            Die vom Spieler eingegebene Zeile erzeugt kein Echo und wird auch
            nicht erkannt, wenn der Spieler beobachtet wird.

            Dieser Modus kann nur geaendert werden, wenn telnet enabled ist.

        INPUT_CHARMODE (2):
            Die Verbindung zum User wechselt von Zeilen- auf Zeichenmodus. So
            wird nur ein einzelnes Zeichen (!) vom Spieler empfangen.

            Ist telnet disabled, wird lediglich die Interpretation der
            einkommenden Daten durch den Driver umgeschaltet - das
            Clientprogramm des Spieler verbleibt im gerade aktiven Modus.

            Nachdem die Funktion <fun> ausgefuehrt wurde, wechselt die
            Verbindung zurueck in Zeilenmodus, ausser ein nachfolgendes
            input_to( , 2) wurde gestartet.

            Zeilenumbrueche werden je nach Client unterschiedlich empfangen,
            entweder als "", als "\r" gefolgt von "" oder als "\r" (letzteres
            kommt vor allem bei Windows Clients vor).

            Das Frontend des Spielers kann dauernd im Zeilenmodus bleiben.
            Auch wenn input_to() nur ein einzelnes Zeichen fordert, muss der
            Spieler unter Umstaenden das Zeichen und einen Zeilenumbruch
            druecken (und senden). Normalerweise erhaelt <fun> dann den
            gesamten Input auf einmal.

            Will man laenger im Zeichenmodus bleiben, kann der Overhead
            reduziert werden, indem set_combine_charset() verwendet wird. So
            koennen Zeichensequenzen als ein String anstelle von
            Zeichen-fuer-Zeichen empfangen werden. In einem screenorientierten
            Editor gilt dies fuer die meisten druckbaren Zeichen.

        INPUT_PROMPT (4):
            Das Argument nach dem <flag> wird als Prompt fuer die Eingabe
            verwendet. Wenn dieses Argument nicht angegeben (und damit kein
            Propmt definiert) ist, wird kein Prompt ausgegeben.

        INPUT_NO_TELNET (8):
            Modifiziert das INPUT_CHARMODE Argument: der Driver aendert
            seine Behandlung von eingehenden Daten entsprechend dem _CHARMODE
            Argument, sendet aber keine Telnetkommandos zur Anpassung
            des Verhaltens des Clientprogrammes.

        INPUT_APPEND (16):
            Das input_to() wird an die Liste der bereits anhaengigen
            input_tos angehaengt.

        INPUT_IGNORE_BANG (128):
            Eingaben, die mit ! beginnen, werden NICHT als Kommandi geparset,
            sondern auch als Argument an die Funkion <fun> uebergeben. Die
            Verwendung dieses Flags ist eingeschraenkt.

        Alle nachfolgenden Argumente werden als zweites bzw. drittes usw.
        Argument an <fun> uebergeben.

BEISPIEL
        void func()
        {
            ...
            input_to("enter_name", INPUT_PROMPT, "Wie lautet dein Name?:");
            /* Frueher erledigte man dies mit:
             *   write("Wie lautet dein Name?:");
             *   input_to("enter_name");
             */
             ...
         }

         enter_name(string str)
         {
            write("Heisst du wirklich '"+str+"'?? *kicher*\n");
            ...
        }

        Bei der input_to() Anweisung fuehrt der Driver die Funktion
        func() aus, erwartet aber gleichzeitig Input vom Spieler. Wenn
        dieser etwas eingegeben UND DIE ENTERTASTE GEDRUECKT HAT, arbeitet
        der Driver die Funktion enter_name() mit dem eingegebenen String
        als Argument ab.


        void func() {
          ..
          input_to("enter_firstname");
          input_to("enter_lastname, INPUT_APPEND);
          ...
        }

        Diese Sequenze erzeugt zwei input_tos: Eingaben gehen zuerst
        an enter_firstname(); und wenn diese Funktion fertig ist
        (einschliesslich etwaiger eigener non-INPUT_APPEND input_tos), geht
        die naechste Eingabe an enter_lastname().

AENDERUNGEN
        Die Bedeutung von <flag> wurde in 3.2.1@93 erweitert.
        Die Limitierung fuer das "stapeln" von input_to()s aus !-Kommandi
            wurde in LDMud 3.2.8 implementiert.
        Seit LDMud 3.2.8 kann <fun> in Form einer Closure angegeben werden.
        LDMud 3.2.9 fuehrte das Flag INPUT_PROMPT samt zugehoerigem Argument
            ein.
        LDMud 3.2.11/3.3.593 fuehrte das INPUT_NO_TELNET Flag ein.
        LDMud 3.2.11/3.3.637 fuehrte das INPUT_APPEND Flag ein.

BUGS
        Im Zeichenmodus sollten Zeilenumbrueche eigentlich als "\n" zurueck
        gegeben werden. Dies allerdings kann existierenden Code zerstoeren.

SIEHE AUCH
        call_other(E), sscanf(E), privilege_violation(M),
        set_combine_charset(E), query_input_pending(E), find_input_to(E),
        input_to_info(E), remove_input_to(E), enable_telnet(E)
