* Copyright (c) 1988 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)termin.c 4.1 (Berkeley) 12/4/88";
/* this takes characters from the keyboard, and produces 3270 keystroke
#include "../general/general.h"
#include "../ctlr/function.h"
#include "../ctlr/externs.h"
#include "../ctlr/declare.h"
#include "../api/astosc.h"
#include "../general/globals.h"
#define IsControl(c) (!isprint(c) || (isspace(c) && ((c) != ' ')))
#define NextState(x) (x->next)
/* XXX temporary - hard code in the state table */
#define MATCH_ANY 0xff /* actually, match any character */
ourBuffer
[100], /* where we store stuff */
*ourPHead
= ourBuffer
, /* first character in buffer */
*ourPTail
= ourBuffer
, /* where next character goes */
*TransPointer
= 0; /* For transparent mode data */
static int WaitingForSynch
;
*spacePTR
= 0; /* Space is hard to enter */
*headOfControl
= 0; /* where we enter code state table */
#define FullChar ((ourPTail+5) >= ourBuffer+sizeof ourBuffer)
#define EmptyChar (ourPTail == ourPHead)
* Initialize the keyboard variables.
ourPHead
= ourPTail
= ourBuffer
;
* Initialize the keyboard mapping file.
extern state
*InitControl();
register struct astosc
*ptr
;
headOfControl
= InitControl((char *)0, 0, ascii_to_index
);
if (!headOfControl
) { /* should not occur */
for (ptr
= &astosc
[0]; ptr
<= &astosc
[highestof(astosc
)]; ptr
++) {
if (ptr
->function
== FCN_SPACE
) {
/* AddChar - put a function index in our buffer */
RingBell("Typeahead buffer full");
/* FlushChar - put everything where it belongs */
int mode
; /* Which KIND of transparent input */
int onoff
; /* Going in, or coming out */
/* Flush pending input */
TransPointer
= ourBuffer
;
/* send data from us to next link in stream */
register struct astosc
*ptr
;
while (!EmptyChar
) { /* send up the link */
ptr
= &astosc
[*ourPHead
];
if (AcceptKeystroke(ptr
->scancode
, ptr
->shiftstate
) == 1) {
/* return value answers question: "did we do anything useful?" */
DataFromTerminal(buffer
, count
)
register char *buffer
; /* the data read in */
register int count
; /* how many bytes in this buffer */
register state
*regControlPointer
;
static state
*controlPointer
;
if ((count
+TransPointer
) >= (ourBuffer
+sizeof ourBuffer
)) {
i
= ourBuffer
+sizeof ourBuffer
-TransPointer
;
*TransPointer
++ = c
|0x80;
SendTransparent((char *)ourBuffer
, TransPointer
-ourBuffer
);
TransPointer
= 0; /* Done */
if (!InControl
&& !IsControl(c
)) {
AddChar(c
); /* add ascii character */
if (!InControl
) { /* first character of sequence */
controlPointer
= headOfControl
;
/* control pointer points to current position in state table */
for (regControlPointer
= controlPointer
; ;
regControlPointer
= NextState(regControlPointer
)) {
if (!regControlPointer
) { /* ran off end */
RingBell("Invalid control sequence");
regControlPointer
= headOfControl
;
count
= 0; /* Flush current input */
if ((regControlPointer
->match
== c
) /* hit this character */
|| (regControlPointer
->match
== MATCH_ANY
)) {
result
= regControlPointer
->result
;
if (result
== STATE_GOTO
) {
regControlPointer
= regControlPointer
->address
;
break; /* go to next character */
if (astosc
[result
].function
== FCN_SYNCH
) {
RingBell("Need to type synch character");
else if (astosc
[result
].function
== FCN_FLINP
) {
FlushChar(); /* Don't add FLINP */
if (astosc
[result
].function
== FCN_MASTER_RESET
) {
AddChar(result
); /* add this code */
InControl
= 0; /* out of control now */
controlPointer
= regControlPointer
; /* save state */
(void) TerminalIn(); /* try to send data */