SYNOPSIS
        #include <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 Kommandos geparst,
            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.


BEISPIELE
        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");
             */
             ...
         }

        void 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().

GESCHICHTE
        Die Bedeutung von <flag> wurde in 3.2.1@93 erweitert.
        Die Limitierung fuer das "stapeln" von input_to()s aus !-Kommandos
            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.

FEHLER
        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)
