Loading...
Select Version
Der INPUT-Exit forinput wird bei Eingaben im Formatmodus aufgerufen und reagiert auf die Eingaben wie folgt:
Benutzerkommandos werden abgesetzt:
KDCOUT: Drücken der Taste F1
KDCDISP: Drücken der Taste F2
KDCOFF: erstes Zeichen der Eingabe ist "/"; wird nur außerhalb eines Vorgangs akzeptiert.
Soll dem Benutzer zusätzlich die Eingabe von KDCLAST und KDCFOR erlaubt werden, muss das Programm entsprechend erweitert werden.
Dieser INPUT-Exit wird mit der KDCDEF-Anweisung EXIT generiert:
KDCDEF-Anweisung
EXIT PROGRAM=FORINPUT,USAGE=(INPUT,FORMMODE)
Event-Exit INPUT
#include <string.h>
#include <kcinp.h>
#define KDCDISP 2
#define KDCOUT 1
#define NOKEY 0
#define FKEY 1
#define KDCOFF "KDCOFF "
#define NOTAC (strncmp (param->kcicfinf, "ON", 2) != 0)
#define CV_END (strncmp (param->kcicvst, "EC", 2) == 0)
#define TAC param->kcicvtac[0]
#define fkey param->kcifkey
#define cmd param->kcintac
#define nexttac param->kcintac
#define errcode param->kcierrcd
#define contcode param->kciccd
#define firstchar param->kcifch[0]
#define cut param->kcicut
static int key( struct kc_inp * );
static void func_control( struct kc_inp * );
static void cv_continue( struct kc_inp * );
void forinput ( struct kc_inp *param )
{
if ( key ( param ) == NOKEY) /* No F-Key */
{ if ( CV_END)
func_control ( param );
else
cv_continue ( param );
}
}
/*************************************************************************/
/* function key for checking F-key */
/*************************************************************************/
int key ( struct kc_inp *param )
{
int key_value = NOKEY;
if (fkey > 0)
{ switch (fkey)
{
case KDCOUT:
memcpy (cmd, "KDCOUT ", 8);
memcpy (contcode, "CD", 2);
cut = ́N ́;
memset (errcode, ́ ́, 4);
key_value = FKEY;
break;
default: break;
}
}
return key_value;
}
/**************************************************************************/
/* function func_control: checking the next FUNCTION out of conversation*/
/************************************************************************ */
void func_control ( struct kc_inp * param )
{
if (firstchar == ́/ ́) /* check the first character*/
{ memcpy (cmd, KDCOFF, 8); /* of input: ́/ ́ = KDCOFF */
memcpy (contcode, "CD", 2);
cut = ́N ́;
memset (errcode, ́ ́, 4);
}
else /* check control field */
{
if (NOTAC) /* no input in control field*/
{ memset (nexttac, ́ ́, 8);
memcpy (contcode, "ER", 2);
cut = ́N ́;
memcpy (errcode, "ER01", 4);
}
else
{ switch (TAC) /* TAC for the next */
{ /* conversation */
case ́1 ́:
memcpy (nexttac, "DTAC1 ", 8);
memcpy (contcode, "SC", 2);
cut = ́Y ́;
memset (errcode, ́ ́, 4);
break;
case ́2 ́:
memcpy (nexttac, "DTAC3 ", 8);
memcpy (contcode, "SC", 2);
cut = ́Y ́;
memset (errcode, ́ ́, 4);
break;
case ́3 ́:
memcpy (nexttac, "DTAC6 ", 8);
memcpy (contcode, "SC", 2);
cut = ́Y ́;
memset (errcode, ́ ́, 4);
break;
default: /* TAC is invalid */
memset (nexttac, ́ ́, 8);
memcpy (contcode, "ER", 2);
cut = ́N ́;
memcpy (errcode, "ER02", 4);
break;
}
}
}
}
/*************************************************************************/
/* function cv_continue: continue the conversation */
/*************************************************************************/
void cv_continue ( struct kc_inp * param )
{ memset (nexttac, ́ ́, 8);
memcpy (contcode, "CC", 2);
cut = ́N ́;
memset (errcode, ́ ́, 4);
}