130015Sminshall /* 233816Sbostic * Copyright (c) 1988 Regents of the University of California. 333816Sbostic * All rights reserved. 430015Sminshall * 533816Sbostic * Redistribution and use in source and binary forms are permitted 634887Sbostic * provided that the above copyright notice and this paragraph are 734887Sbostic * duplicated in all such forms and that any documentation, 834887Sbostic * advertising materials, and other materials related to such 934887Sbostic * distribution and use acknowledge that the software was developed 1034887Sbostic * by the University of California, Berkeley. The name of the 1134887Sbostic * University may not be used to endorse or promote products derived 1234887Sbostic * from this software without specific prior written permission. 1334887Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434887Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534887Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1630015Sminshall */ 1730015Sminshall 1833816Sbostic #ifndef lint 19*39469Sminshall static char sccsid[] = "@(#)inbound.c 4.2 (Berkeley) 10/31/89"; 2033816Sbostic #endif /* not lint */ 2134887Sbostic 2231085Sminshall #include <stdio.h> 2331085Sminshall 2431177Sminshall #include "../general/general.h" 2530015Sminshall #include "function.h" 2630015Sminshall #include "hostctlr.h" 2731192Sminshall #include "oia.h" 2830015Sminshall #include "scrnctlr.h" 2930015Sminshall #include "screen.h" 3030015Sminshall #include "options.h" 3131871Sminshall #include "../api/dctype.h" 3231871Sminshall #include "../api/ebc_disp.h" 3330015Sminshall 3431177Sminshall #include "../general/globals.h" 3535421Sminshall #include "externs.h" 3635421Sminshall #include "declare.h" 3730015Sminshall 3830015Sminshall #define EmptyChar() (ourPTail == ourPHead) 3930015Sminshall #define FullChar() (ourPHead == ourBuffer+sizeof ourBuffer) 4030015Sminshall 4130015Sminshall 4230015Sminshall /* 4330015Sminshall * We define something to allow us to to IsProtected() quickly 4430015Sminshall * on unformatted screens (with the current algorithm for fields, 4530015Sminshall * unprotected takes exponential time...). 4630015Sminshall * 4730015Sminshall * The idea is to call SetXIsProtected() BEFORE the 4830015Sminshall * loop, then use XIsProtected(). 4930015Sminshall */ 5030015Sminshall 5130361Sminshall #define SetXIsProtected() (XWasSF = 1) 5230361Sminshall #define XIsProtected(p) (IsStartField(p)? \ 5330361Sminshall XWasSF = 1 : \ 5430361Sminshall (XWasSF? \ 5530361Sminshall (XWasSF = 0, XProtected = IsProtected(p)) : \ 5630361Sminshall XProtected)) 5730015Sminshall 5830015Sminshall static char ourBuffer[400]; 5930015Sminshall 6030015Sminshall static char *ourPHead = ourBuffer, 6130015Sminshall *ourPTail = ourBuffer; 6230015Sminshall 6330327Sminshall static int HadAid; /* Had an AID haven't sent */ 6430015Sminshall 6530327Sminshall static int InsertMode; /* is the terminal in insert mode? */ 6630327Sminshall 6735421Sminshall static unsigned int 6835421Sminshall rememberedshiftstate; /* Shift (alt) state of terminal */ 6935421Sminshall 7031197Sminshall # define HITNUM(s) ((((s)&(SHIFT_CAPS|SHIFT_UPSHIFT))? 1:0) \ 7131197Sminshall + ((((s)&SHIFT_ALT)? 1:0)<<1)) 7231197Sminshall 7330361Sminshall static int XWasSF, XProtected; /* For optimizations */ 7430076Sminshall #if !defined(PURE3274) 7530076Sminshall extern int TransparentClock, OutputClock; 7630076Sminshall #endif /* !defined(PURE3274) */ 7730076Sminshall 7830327Sminshall #include "kbd.out" /* Get keyboard mapping function */ 7930015Sminshall 8030015Sminshall /* the following are global variables */ 8130015Sminshall 8230015Sminshall extern int UnLocked; /* keyboard is UnLocked? */ 8330015Sminshall 8430724Sminshall 8530724Sminshall /* 8630724Sminshall * init_inbound : 8730724Sminshall * 8830724Sminshall * Reset variables to initial state. 8930724Sminshall */ 9030724Sminshall 9130724Sminshall void 9230724Sminshall init_inbound() 9330724Sminshall { 9430724Sminshall ourPHead = ourPTail = ourBuffer; 9530724Sminshall HadAid = 0; 9631197Sminshall rememberedshiftstate = 0; 9730724Sminshall InsertMode = 0; 9830724Sminshall } 9930724Sminshall 10030724Sminshall 10130015Sminshall /* Tab() - sets cursor to the start of the next unprotected field */ 10230015Sminshall static void 10330015Sminshall Tab() 10430015Sminshall { 10530015Sminshall register int i, j; 10630015Sminshall 10730015Sminshall i = CursorAddress; 10830015Sminshall j = WhereAttrByte(CursorAddress); 10930015Sminshall do { 11030015Sminshall if (IsStartField(i) && IsUnProtected(ScreenInc(i))) { 11130015Sminshall break; 11230015Sminshall } 11330015Sminshall i = FieldInc(i); 11430015Sminshall } while (i != j); 11530015Sminshall if (IsStartField(i) && IsUnProtected(ScreenInc(i))) { 11630015Sminshall CursorAddress = ScreenInc(i); 11730015Sminshall } else { 11830015Sminshall CursorAddress = SetBufferAddress(0,0); 11930015Sminshall } 12030015Sminshall } 12130015Sminshall 12230015Sminshall 12330015Sminshall /* BackTab() - sets cursor to the start of the most recent field */ 12430015Sminshall 12530015Sminshall static void 12630015Sminshall BackTab() 12730015Sminshall { 12830015Sminshall register int i; 12930015Sminshall 13030015Sminshall i = ScreenDec(CursorAddress); 13130015Sminshall for (;;) { 13230015Sminshall if (IsStartField(ScreenDec(i)) && IsUnProtected(i)) { 13330015Sminshall CursorAddress = i; 13430015Sminshall break; 13530015Sminshall } 13630015Sminshall if (i == CursorAddress) { 13730015Sminshall CursorAddress = SetBufferAddress(0,0); 13830015Sminshall break; 13930015Sminshall } 14030015Sminshall i = ScreenDec(i); 14130015Sminshall } 14230015Sminshall } 14330015Sminshall 14433752Sminshall /* 14533752Sminshall * ModifyMdt() - Turn a modified data tag bit on or off (watch 14633752Sminshall * out for unformatted screens). 14733752Sminshall */ 14830015Sminshall 14933752Sminshall ModifyMdt(x,on) 15033752Sminshall int x; 15133752Sminshall int on; 15233752Sminshall { 15333752Sminshall int i = x; 15433752Sminshall 15533752Sminshall if (IsStartField(i)) { /* If we are at a start field position... */ 15633752Sminshall if (on) { 15733752Sminshall ModifyHost(i, |= ATTR_MDT); /* Turn it on */ 15833752Sminshall } else { 15933752Sminshall ModifyHost(i, &= ~ATTR_MDT); /* Turn it off */ 16033752Sminshall } 16133752Sminshall } else { 16233752Sminshall i = WhereAttrByte(i); /* Find beginning of field */ 16333752Sminshall if (IsStartField(i)) { /* Is there one? */ 16433752Sminshall if (on) { 16533752Sminshall ModifyHost(i, |= ATTR_MDT); /* Turn it on */ 16633752Sminshall } else { 16733752Sminshall ModifyHost(i, &= ~ATTR_MDT); /* Turn it off */ 16833752Sminshall } 16933752Sminshall } /* else, don't modify - this is an unformatted screen */ 17033752Sminshall } 17133752Sminshall } 17233752Sminshall 17333752Sminshall 17430015Sminshall /* EraseEndOfField - erase all characters to the end of a field */ 17530015Sminshall 17630015Sminshall static void 17730015Sminshall EraseEndOfField() 17830015Sminshall { 17930015Sminshall register int i; 18030015Sminshall 18130015Sminshall if (IsProtected(CursorAddress)) { 18230015Sminshall RingBell("Protected Field"); 18330015Sminshall } else { 18430015Sminshall TurnOnMdt(CursorAddress); 18530015Sminshall if (FormattedScreen()) { 18630015Sminshall i = CursorAddress; 18730015Sminshall do { 18830015Sminshall AddHost(i, 0); 18930015Sminshall i = ScreenInc(i); 19030015Sminshall } while ((i != CursorAddress) && !IsStartField(i)); 19130015Sminshall } else { /* Screen is Unformatted */ 19230015Sminshall i = CursorAddress; 19330015Sminshall do { 19430015Sminshall AddHost(i, 0); 19530015Sminshall i = ScreenInc(i); 19630015Sminshall } while (i != HighestScreen()); 19730015Sminshall } 19830015Sminshall } 19930015Sminshall } 20030015Sminshall 20130015Sminshall /* Delete() - deletes a character from the screen 20230015Sminshall * 20330015Sminshall * What we want to do is delete the section 20430015Sminshall * [where, from-1] from the screen, 20530015Sminshall * filling in with what comes at from. 20630015Sminshall * 20730015Sminshall * The deleting continues to the end of the field (or 20830015Sminshall * until the cursor wraps). 20930015Sminshall * 21030015Sminshall * From can be a start of a field. We 21130015Sminshall * check for that. However, there can't be any 21230015Sminshall * fields that start between where and from. 21330015Sminshall * We don't check for that. 21430015Sminshall * 21530015Sminshall * Also, we assume that the protection status of 21630015Sminshall * everything has been checked by the caller. 21730015Sminshall * 21830015Sminshall */ 21930015Sminshall 22030015Sminshall static void 22130015Sminshall Delete(where, from) 22230015Sminshall register int where, /* Where to start deleting from */ 22330015Sminshall from; /* Where to pull back from */ 22430015Sminshall { 22530015Sminshall register int i; 22630015Sminshall 22730015Sminshall TurnOnMdt(where); /* Only do this once in this field */ 22830015Sminshall i = where; 22930015Sminshall do { 23030015Sminshall if (IsStartField(from)) { 23130015Sminshall AddHost(i, 0); /* Stick the edge at the start field */ 23230015Sminshall } else { 23335421Sminshall AddHost(i, (char)GetHost(from)); 23430015Sminshall from = ScreenInc(from); /* Move the edge */ 23530015Sminshall } 23630015Sminshall i = ScreenInc(i); 23730015Sminshall } while ((!IsStartField(i)) && (i != where)); 23830015Sminshall } 23930015Sminshall 24030015Sminshall static void 24130015Sminshall ColBak() 24230015Sminshall { 24330015Sminshall register int i; 24430015Sminshall 24530015Sminshall i = ScreenLineOffset(CursorAddress); 24630015Sminshall for (i = i-1; i >= 0; i--) { 24730015Sminshall if (OptColTabs[i]) { 24830015Sminshall break; 24930015Sminshall } 25030015Sminshall } 25130015Sminshall if (i < 0) { 25230015Sminshall i = 0; 25330015Sminshall } 25430015Sminshall CursorAddress = SetBufferAddress(ScreenLine(CursorAddress), i); 25530015Sminshall } 25630015Sminshall 25730015Sminshall static void 25830015Sminshall ColTab() 25930015Sminshall { 26030015Sminshall register int i; 26130015Sminshall 26230015Sminshall i = ScreenLineOffset(CursorAddress); 26330015Sminshall for (i = i+1; i < NumberColumns; i++) { 26430015Sminshall if (OptColTabs[i]) { 26530015Sminshall break; 26630015Sminshall } 26730015Sminshall } 26830015Sminshall if (i >= NumberColumns) { 26930015Sminshall i = NumberColumns-1; 27030015Sminshall } 27130015Sminshall CursorAddress = SetBufferAddress(ScreenLine(CursorAddress), i); 27230015Sminshall } 27330015Sminshall 27430015Sminshall static void 27530015Sminshall Home() 27630015Sminshall { 27730015Sminshall register int i; 27830015Sminshall register int j; 27930015Sminshall 28030015Sminshall i = SetBufferAddress(OptHome, 0); 28130015Sminshall j = WhereLowByte(i); 282*39469Sminshall /* 283*39469Sminshall * If the initial value of i points to the field attribute of 284*39469Sminshall * an unprotected field, we need to return the address of the 285*39469Sminshall * first data byte in the field (assuming there are any!). 286*39469Sminshall */ 287*39469Sminshall if (IsStartField(i) && IsUnProtected(j)) { 288*39469Sminshall CursorAddress = j; 289*39469Sminshall return; 290*39469Sminshall } 29130015Sminshall do { 29230015Sminshall if (IsUnProtected(i)) { 29330015Sminshall CursorAddress = i; 29430015Sminshall return; 29530015Sminshall } 29630015Sminshall /* the following could be a problem if we got here with an 29730015Sminshall * unformatted screen. However, this is "impossible", since 29830015Sminshall * with an unformatted screen, the IsUnProtected(i) above 29930015Sminshall * should be true. 30030015Sminshall */ 30130015Sminshall i = ScreenInc(FieldInc(i)); 30230015Sminshall } while (i != j); 30330015Sminshall CursorAddress = LowestScreen(); 30430015Sminshall } 30530015Sminshall 30630015Sminshall static 30730015Sminshall LastOfField(i) 30830015Sminshall register int i; /* position to start from */ 30930015Sminshall { 31030015Sminshall register int j; 31130015Sminshall register int k; 31230015Sminshall 31330015Sminshall k = j = i; 31430015Sminshall SetXIsProtected(); 31530015Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 31630015Sminshall i = ScreenInc(i); 31730015Sminshall if (i == j) { 31830015Sminshall break; 31930015Sminshall } 32030015Sminshall } 32130015Sminshall /* We are now IN a word IN an unprotected field (or wrapped) */ 32230015Sminshall while (!XIsProtected(i)) { 32330015Sminshall if (!Disspace(GetHost(i))) { 32430015Sminshall k = i; 32530015Sminshall } 32630015Sminshall i = ScreenInc(i); 32730015Sminshall if (i == j) { 32830015Sminshall break; 32930015Sminshall } 33030015Sminshall } 33130015Sminshall return(k); 33230015Sminshall } 33330015Sminshall 33430015Sminshall 33530015Sminshall static void 33630015Sminshall FlushChar() 33730015Sminshall { 33830015Sminshall ourPTail = ourPHead = ourBuffer; 33930015Sminshall } 34030015Sminshall 34130015Sminshall 34230015Sminshall /* 34330015Sminshall * Add one EBCDIC (NOT display code) character to the buffer. 34430015Sminshall */ 34530015Sminshall 34630015Sminshall static void 34730015Sminshall AddChar(character) 34830015Sminshall char character; 34930015Sminshall { 35030015Sminshall if (FullChar()) { 35130015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 0); 35230015Sminshall if (EmptyChar()) { 35330015Sminshall FlushChar(); 35430015Sminshall } else { 35530073Sminshall char buffer[100]; 35630073Sminshall 35730073Sminshall sprintf(buffer, "File %s, line %d: No room in network buffer!\n", 35830015Sminshall __FILE__, __LINE__); 35935421Sminshall ExitString(buffer, 1); 36030073Sminshall /*NOTREACHED*/ 36130015Sminshall } 36230015Sminshall } 36330015Sminshall *ourPHead++ = character; 36430015Sminshall } 36530015Sminshall 36630015Sminshall 36730015Sminshall static void 36830015Sminshall SendUnformatted() 36930015Sminshall { 37030015Sminshall register int i, j; 37130015Sminshall register int Nulls; 37230015Sminshall register int c; 37330015Sminshall 37430015Sminshall /* look for start of field */ 37530015Sminshall Nulls = 0; 37630015Sminshall i = j = LowestScreen(); 37730015Sminshall do { 37830015Sminshall c = GetHost(i); 37930015Sminshall if (c == 0) { 38030015Sminshall Nulls++; 38130015Sminshall } else { 38230015Sminshall while (Nulls) { 38330015Sminshall Nulls--; 38430015Sminshall AddChar(EBCDIC_BLANK); /* put in blanks */ 38530015Sminshall } 38635421Sminshall AddChar((char)disp_ebc[c]); 38730015Sminshall } 38830015Sminshall i = ScreenInc(i); 38930015Sminshall } while (i != j); 39030015Sminshall } 39130015Sminshall 39230015Sminshall static 39335421Sminshall SendField(i, cmd) 39430015Sminshall register int i; /* where we saw MDT bit */ 39535421Sminshall int cmd; /* The command code (type of read) */ 39630015Sminshall { 39730015Sminshall register int j; 39830015Sminshall register int k; 39930015Sminshall register int Nulls; 40030015Sminshall register int c; 40130015Sminshall 40230015Sminshall /* look for start of field */ 40330015Sminshall i = j = WhereLowByte(i); 40430015Sminshall 40530015Sminshall /* On a test_request_read, don't send sba and address */ 40630015Sminshall if ((AidByte != AID_TREQ) 40735421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 40830015Sminshall AddChar(ORDER_SBA); /* set start field */ 40930015Sminshall AddChar(BufferTo3270_0(j)); /* set address of this field */ 41030015Sminshall AddChar(BufferTo3270_1(j)); 41130015Sminshall } 41230015Sminshall /* 41330015Sminshall * Only on read_modified_all do we return the contents 41430015Sminshall * of the field when the attention was caused by a 41530015Sminshall * selector pen. 41630015Sminshall */ 41730015Sminshall if ((AidByte != AID_SELPEN) 41835421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 41930015Sminshall if (!IsStartField(j)) { 42030015Sminshall Nulls = 0; 42130015Sminshall k = ScreenInc(WhereHighByte(j)); 42230015Sminshall do { 42330015Sminshall c = GetHost(j); 42430015Sminshall if (c == 0) { 42530015Sminshall Nulls++; 42630015Sminshall } else { 42730015Sminshall while (Nulls) { 42830015Sminshall Nulls--; 42930015Sminshall AddChar(EBCDIC_BLANK); /* put in blanks */ 43030015Sminshall } 43135421Sminshall AddChar((char)disp_ebc[c]); 43230015Sminshall } 43330015Sminshall j = ScreenInc(j); 43430015Sminshall } while ((j != k) && (j != i)); 43530015Sminshall } 43630015Sminshall } else { 43730015Sminshall j = FieldInc(j); 43830015Sminshall } 43930015Sminshall return(j); 44030015Sminshall } 44130015Sminshall 44230015Sminshall /* Various types of reads... */ 44330015Sminshall void 44435421Sminshall DoReadModified(cmd) 44535421Sminshall int cmd; /* The command sent */ 44630015Sminshall { 44730015Sminshall register int i, j; 44830015Sminshall 44930015Sminshall if (AidByte) { 45030015Sminshall if (AidByte != AID_TREQ) { 45130015Sminshall AddChar(AidByte); 45230015Sminshall } else { 45330015Sminshall /* Test Request Read header */ 45430015Sminshall AddChar(EBCDIC_SOH); 45530015Sminshall AddChar(EBCDIC_PERCENT); 45630015Sminshall AddChar(EBCDIC_SLASH); 45730015Sminshall AddChar(EBCDIC_STX); 45830015Sminshall } 45930015Sminshall } else { 46030015Sminshall AddChar(AID_NONE); 46130015Sminshall } 46230015Sminshall if (((AidByte != AID_PA1) && (AidByte != AID_PA2) 46330015Sminshall && (AidByte != AID_PA3) && (AidByte != AID_CLEAR)) 46435421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 46530015Sminshall if ((AidByte != AID_TREQ) 46635421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 46730015Sminshall /* Test request read_modified doesn't give cursor address */ 46830015Sminshall AddChar(BufferTo3270_0(CursorAddress)); 46930015Sminshall AddChar(BufferTo3270_1(CursorAddress)); 47030015Sminshall } 47130015Sminshall i = j = WhereAttrByte(LowestScreen()); 47230015Sminshall /* Is this an unformatted screen? */ 47330015Sminshall if (!IsStartField(i)) { /* yes, handle separate */ 47430015Sminshall SendUnformatted(); 47530015Sminshall } else { 47630015Sminshall do { 47730015Sminshall if (HasMdt(i)) { 47835421Sminshall i = SendField(i, cmd); 47930015Sminshall } else { 48030015Sminshall i = FieldInc(i); 48130015Sminshall } 48230015Sminshall } while (i != j); 48330015Sminshall } 48430015Sminshall } 48530015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 48630015Sminshall if (EmptyChar()) { 48730015Sminshall FlushChar(); 48830015Sminshall HadAid = 0; /* killed that buffer */ 48930015Sminshall } 49030015Sminshall } 49130015Sminshall 49230015Sminshall /* A read buffer operation... */ 49330015Sminshall 49430015Sminshall void 49530015Sminshall DoReadBuffer() 49630015Sminshall { 49730015Sminshall register int i, j; 49830015Sminshall 49930015Sminshall if (AidByte) { 50030015Sminshall AddChar(AidByte); 50130015Sminshall } else { 50230015Sminshall AddChar(AID_NONE); 50330015Sminshall } 50430015Sminshall AddChar(BufferTo3270_0(CursorAddress)); 50530015Sminshall AddChar(BufferTo3270_1(CursorAddress)); 50630015Sminshall i = j = LowestScreen(); 50730015Sminshall do { 50830015Sminshall if (IsStartField(i)) { 50930015Sminshall AddChar(ORDER_SF); 51030015Sminshall AddChar(BufferTo3270_1(FieldAttributes(i))); 51130015Sminshall } else { 51235421Sminshall AddChar((char)disp_ebc[GetHost(i)]); 51330015Sminshall } 51430015Sminshall i = ScreenInc(i); 51530015Sminshall } while (i != j); 51630015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 51730015Sminshall if (EmptyChar()) { 51830015Sminshall FlushChar(); 51930015Sminshall HadAid = 0; /* killed that buffer */ 52030015Sminshall } 52130015Sminshall } 52231864Sminshall 52331864Sminshall /* Send some transparent data to the host */ 52431864Sminshall 52531864Sminshall void 52631864Sminshall SendTransparent(buffer, count) 52731864Sminshall char *buffer; 52831864Sminshall int count; 52931864Sminshall { 53031864Sminshall char stuff[3]; 53131864Sminshall 53231864Sminshall stuff[0] = AID_NONE_PRINTER; 53331864Sminshall stuff[1] = BufferTo3270_0(count); 53431864Sminshall stuff[2] = BufferTo3270_1(count); 53531864Sminshall DataToNetwork(stuff, sizeof stuff, 0); 53631864Sminshall DataToNetwork(buffer, count, 1); 53731864Sminshall } 53831864Sminshall 53931864Sminshall 54030015Sminshall /* Try to send some data to host */ 54130015Sminshall 54230015Sminshall void 54330015Sminshall SendToIBM() 54430015Sminshall { 54530076Sminshall #if !defined(PURE3274) 54631864Sminshall if (TransparentClock >= OutputClock) { 54730015Sminshall if (HadAid) { 54830015Sminshall AddChar(AidByte); 54930015Sminshall HadAid = 0; 55030015Sminshall } else { 55130015Sminshall AddChar(AID_NONE_PRINTER); 55230015Sminshall } 55330015Sminshall do { 55430015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 55530015Sminshall } while (!EmptyChar()); 55630015Sminshall FlushChar(); 55730015Sminshall } else if (HadAid) { 55830015Sminshall DoReadModified(CMD_READ_MODIFIED); 55930015Sminshall } 56030076Sminshall #else /* !defined(PURE3274) */ 56130076Sminshall if (HadAid) { 56230076Sminshall DoReadModified(CMD_READ_MODIFIED); 56330076Sminshall } 56430076Sminshall #endif /* !defined(PURE3274) */ 56530015Sminshall } 56630015Sminshall 56730015Sminshall /* This takes in one character from the keyboard and places it on the 56830015Sminshall * screen. 56930015Sminshall */ 57030015Sminshall 57130015Sminshall static void 57230015Sminshall OneCharacter(c, insert) 57330015Sminshall int c; /* character (Ebcdic) to be shoved in */ 57430015Sminshall int insert; /* are we in insert mode? */ 57530015Sminshall { 57630015Sminshall register int i, j; 57730015Sminshall 57830015Sminshall if (IsProtected(CursorAddress)) { 57930015Sminshall RingBell("Protected Field"); 58030015Sminshall return; 58130015Sminshall } 58230015Sminshall if (insert) { 58330015Sminshall /* is the last character in the field a blank or null? */ 58430015Sminshall i = ScreenDec(FieldInc(CursorAddress)); 58530015Sminshall j = GetHost(i); 58630015Sminshall if (!Disspace(j)) { 58730015Sminshall RingBell("No more room for insert"); 58830015Sminshall return; 58930015Sminshall } else { 59030015Sminshall for (j = ScreenDec(i); i != CursorAddress; 59130015Sminshall j = ScreenDec(j), i = ScreenDec(i)) { 59235421Sminshall AddHost(i, (char)GetHost(j)); 59330015Sminshall } 59430015Sminshall } 59530015Sminshall } 59630015Sminshall AddHost(CursorAddress, c); 59730015Sminshall TurnOnMdt(CursorAddress); 59830015Sminshall CursorAddress = ScreenInc(CursorAddress); 59930015Sminshall if (IsStartField(CursorAddress) && 60030015Sminshall ((FieldAttributes(CursorAddress)&ATTR_AUTO_SKIP_MASK) == 60130015Sminshall ATTR_AUTO_SKIP_VALUE)) { 60230015Sminshall Tab(); 60330015Sminshall } 60430015Sminshall } 60530015Sminshall 60631197Sminshall /* 60731197Sminshall * AcceptKeystroke() 60831197Sminshall * 60931197Sminshall * Processes one keystroke. 61031197Sminshall * 61131197Sminshall * Returns: 61231197Sminshall * 61331197Sminshall * 0 if this keystroke was NOT processed. 61431197Sminshall * 1 if everything went OK. 61531197Sminshall */ 61630015Sminshall 61730015Sminshall int 61831197Sminshall AcceptKeystroke(scancode, shiftstate) 61935421Sminshall unsigned int 62031197Sminshall scancode, /* 3270 scancode */ 62131197Sminshall shiftstate; /* The shift state */ 62230015Sminshall { 62330015Sminshall register int c; 62430015Sminshall register int i; 62530015Sminshall register int j; 62630076Sminshall enum ctlrfcn ctlrfcn; 62730015Sminshall 62831197Sminshall if (scancode >= numberof(hits)) { 62935421Sminshall ExitString( 63031197Sminshall "Unknown scancode encountered in AcceptKeystroke.\n", 1); 63130015Sminshall /*NOTREACHED*/ 63230015Sminshall } 63331197Sminshall ctlrfcn = hits[scancode].hit[HITNUM(shiftstate)].ctlrfcn; 63431197Sminshall c = hits[scancode].hit[HITNUM(shiftstate)].code; 63530015Sminshall 63630015Sminshall if (!UnLocked || HadAid) { 63730015Sminshall if (HadAid) { 63830015Sminshall SendToIBM(); 63930015Sminshall if (!EmptyChar()) { 64031197Sminshall return 0; /* nothing to do */ 64130015Sminshall } 64230015Sminshall } 64330327Sminshall #if !defined(PURE3274) 64430015Sminshall if (!HadAid && EmptyChar()) { 64530076Sminshall if ((ctlrfcn == FCN_RESET) || (ctlrfcn == FCN_MASTER_RESET)) { 64630015Sminshall UnLocked = 1; 64730015Sminshall } 64830015Sminshall } 64930327Sminshall #endif /* !defined(PURE3274) */ 65030015Sminshall if (!UnLocked) { 65131197Sminshall return 0; 65230015Sminshall } 65330015Sminshall } 65431864Sminshall 65530015Sminshall /* now, either empty, or haven't seen aid yet */ 65630015Sminshall 65730076Sminshall #if !defined(PURE3274) 65831864Sminshall /* 65931864Sminshall * If we are in transparent (output) mode, do something special 66031864Sminshall * with keystrokes. 66131864Sminshall */ 66230015Sminshall if (TransparentClock == OutputClock) { 66331197Sminshall if (ctlrfcn == FCN_AID) { 66431197Sminshall UnLocked = 0; 66531197Sminshall InsertMode = 0; 66631197Sminshall AidByte = (c); 66731197Sminshall HadAid = 1; 66831197Sminshall } else { 66931197Sminshall switch (ctlrfcn) { 67031197Sminshall case FCN_ESCAPE: 67131197Sminshall StopScreen(1); 67231197Sminshall command(0); 67331476Sminshall if (shell_active == 0) { 67431476Sminshall ConnectScreen(); 67531476Sminshall } 67631197Sminshall break; 67730015Sminshall 67831197Sminshall case FCN_RESET: 67931197Sminshall case FCN_MASTER_RESET: 68031197Sminshall UnLocked = 1; 68131197Sminshall break; 68230015Sminshall 68331197Sminshall default: 68431197Sminshall return 0; 68530015Sminshall } 68630015Sminshall } 68730015Sminshall } 68830076Sminshall #endif /* !defined(PURE3274) */ 68930015Sminshall 69031197Sminshall if (ctlrfcn == FCN_CHARACTER) { 69131197Sminshall /* Add the character to the buffer */ 69231197Sminshall OneCharacter(c, InsertMode); 69331197Sminshall } else if (ctlrfcn == FCN_AID) { /* got Aid */ 69431197Sminshall if (c == AID_CLEAR) { 69531197Sminshall LocalClearScreen(); /* Side effect is to clear 3270 */ 69630015Sminshall } 69731197Sminshall ResetOiaOnlineA(&OperatorInformationArea); 69831197Sminshall SetOiaTWait(&OperatorInformationArea); 69931197Sminshall ResetOiaInsert(&OperatorInformationArea); 70031197Sminshall InsertMode = 0; /* just like a 3278 */ 70131197Sminshall SetOiaSystemLocked(&OperatorInformationArea); 70231197Sminshall SetOiaModified(); 70331197Sminshall UnLocked = 0; 70431197Sminshall AidByte = c; 70531197Sminshall HadAid = 1; 70631197Sminshall SendToIBM(); 70731197Sminshall } else { 70831197Sminshall switch (ctlrfcn) { 70930015Sminshall 71031197Sminshall case FCN_CURSEL: 71131197Sminshall c = FieldAttributes(CursorAddress)&ATTR_DSPD_MASK; 71231197Sminshall if (!FormattedScreen() 71331197Sminshall || ((c != ATTR_DSPD_DSPD) && (c != ATTR_DSPD_HIGH))) { 71431197Sminshall RingBell("Cursor not in selectable field"); 71531197Sminshall } else { 71631197Sminshall i = ScreenInc(WhereAttrByte(CursorAddress)); 71731197Sminshall c = GetHost(i); 71831197Sminshall if (c == DISP_QUESTION) { 71931197Sminshall AddHost(i, DISP_GREATER_THAN); 72031197Sminshall TurnOnMdt(i); 72131197Sminshall } else if (c == DISP_GREATER_THAN) { 72231197Sminshall AddHost(i, DISP_QUESTION); 72331197Sminshall TurnOffMdt(i); 72431197Sminshall } else if (c == DISP_BLANK || c == DISP_NULL 72531197Sminshall || c == DISP_AMPERSAND) { 72631197Sminshall UnLocked = 0; 72731197Sminshall InsertMode = 0; 72831197Sminshall ResetOiaOnlineA(&OperatorInformationArea); 72931197Sminshall SetOiaTWait(&OperatorInformationArea); 73031197Sminshall SetOiaSystemLocked(&OperatorInformationArea); 73131197Sminshall ResetOiaInsert(&OperatorInformationArea); 73231197Sminshall SetOiaModified(); 73331197Sminshall if (c == DISP_AMPERSAND) { 73431197Sminshall TurnOnMdt(i); /* Only for & type */ 73531197Sminshall AidByte = AID_ENTER; 73630015Sminshall } else { 73731197Sminshall AidByte = AID_SELPEN; 73830015Sminshall } 73931197Sminshall HadAid = 1; 74031197Sminshall SendToIBM(); 74131197Sminshall } else { 74231197Sminshall RingBell( 74331197Sminshall "Cursor not in a selectable field (designator)"); 74430015Sminshall } 74531197Sminshall } 74631197Sminshall break; 74730015Sminshall 74830327Sminshall #if !defined(PURE3274) 74931197Sminshall case FCN_ERASE: 75031197Sminshall if (IsProtected(ScreenDec(CursorAddress))) { 75131197Sminshall RingBell("Protected Field"); 75231197Sminshall } else { 75331197Sminshall CursorAddress = ScreenDec(CursorAddress); 75431197Sminshall Delete(CursorAddress, ScreenInc(CursorAddress)); 75531197Sminshall } 75631197Sminshall break; 75731197Sminshall case FCN_WERASE: 75831197Sminshall j = CursorAddress; 75931197Sminshall i = ScreenDec(j); 76031197Sminshall if (IsProtected(i)) { 76131197Sminshall RingBell("Protected Field"); 76231197Sminshall } else { 76331197Sminshall SetXIsProtected(); 76431197Sminshall while ((!XIsProtected(i) && Disspace(GetHost(i))) 76531197Sminshall && (i != j)) { 76631197Sminshall i = ScreenDec(i); 76730015Sminshall } 76831197Sminshall /* we are pointing at a character in a word, or 76931197Sminshall * at a protected position 77031197Sminshall */ 77131197Sminshall while ((!XIsProtected(i) && !Disspace(GetHost(i))) 77231197Sminshall && (i != j)) { 77331197Sminshall i = ScreenDec(i); 77430015Sminshall } 77531197Sminshall /* we are pointing at a space, or at a protected 77631197Sminshall * position 77731197Sminshall */ 77831197Sminshall CursorAddress = ScreenInc(i); 77931197Sminshall Delete(CursorAddress, j); 78031197Sminshall } 78131197Sminshall break; 78230015Sminshall 78331197Sminshall case FCN_FERASE: 78431197Sminshall if (IsProtected(CursorAddress)) { 78531197Sminshall RingBell("Protected Field"); 78631197Sminshall } else { 78731197Sminshall CursorAddress = ScreenInc(CursorAddress); /* for btab */ 78831197Sminshall BackTab(); 78931197Sminshall EraseEndOfField(); 79031197Sminshall } 79131197Sminshall break; 79230015Sminshall 79331197Sminshall case FCN_RESET: 79431197Sminshall if (InsertMode) { 79531197Sminshall InsertMode = 0; 79631197Sminshall ResetOiaInsert(&OperatorInformationArea); 79731197Sminshall SetOiaModified(); 79831197Sminshall } 79931197Sminshall break; 80031197Sminshall case FCN_MASTER_RESET: 80131197Sminshall if (InsertMode) { 80231197Sminshall InsertMode = 0; 80331197Sminshall ResetOiaInsert(&OperatorInformationArea); 80431197Sminshall SetOiaModified(); 80531197Sminshall } 80631197Sminshall RefreshScreen(); 80731197Sminshall break; 80830327Sminshall #endif /* !defined(PURE3274) */ 80930015Sminshall 81031197Sminshall case FCN_UP: 81131197Sminshall CursorAddress = ScreenUp(CursorAddress); 81231197Sminshall break; 81330015Sminshall 81431197Sminshall case FCN_LEFT: 81531197Sminshall CursorAddress = ScreenDec(CursorAddress); 81631197Sminshall break; 81730015Sminshall 81831197Sminshall case FCN_RIGHT: 81931197Sminshall CursorAddress = ScreenInc(CursorAddress); 82031197Sminshall break; 82130015Sminshall 82231197Sminshall case FCN_DOWN: 82331197Sminshall CursorAddress = ScreenDown(CursorAddress); 82431197Sminshall break; 82530015Sminshall 82631197Sminshall case FCN_DELETE: 82731197Sminshall if (IsProtected(CursorAddress)) { 82831197Sminshall RingBell("Protected Field"); 82931197Sminshall } else { 83031197Sminshall Delete(CursorAddress, ScreenInc(CursorAddress)); 83131197Sminshall } 83231197Sminshall break; 83331197Sminshall 83431197Sminshall case FCN_INSRT: 83531197Sminshall InsertMode = !InsertMode; 83631197Sminshall if (InsertMode) { 83731197Sminshall SetOiaInsert(&OperatorInformationArea); 83831197Sminshall } else { 83931197Sminshall ResetOiaInsert(&OperatorInformationArea); 84031197Sminshall } 84131197Sminshall SetOiaModified(); 84231197Sminshall break; 84331197Sminshall 84431197Sminshall case FCN_HOME: 84531197Sminshall Home(); 84631197Sminshall break; 84731197Sminshall 84831197Sminshall case FCN_NL: 84931197Sminshall /* The algorithm is to look for the first unprotected 85031197Sminshall * column after column 0 of the following line. Having 85131197Sminshall * found that unprotected column, we check whether the 85231197Sminshall * cursor-address-at-entry is at or to the right of the 85331197Sminshall * LeftMargin AND the LeftMargin column of the found line 85431197Sminshall * is unprotected. If this conjunction is true, then 85531197Sminshall * we set the found pointer to the address of the LeftMargin 85631197Sminshall * column in the found line. 85731197Sminshall * Then, we set the cursor address to the found address. 85831197Sminshall */ 85931197Sminshall i = SetBufferAddress(ScreenLine(ScreenDown(CursorAddress)), 0); 86031197Sminshall j = ScreenInc(WhereAttrByte(CursorAddress)); 86131197Sminshall do { 86231197Sminshall if (IsUnProtected(i)) { 86331197Sminshall break; 86430015Sminshall } 86531197Sminshall /* Again (see comment in Home()), this COULD be a problem 86631197Sminshall * with an unformatted screen. 86731197Sminshall */ 86831197Sminshall /* If there was a field with only an attribute byte, 86931197Sminshall * we may be pointing to the attribute byte of the NEXT 87031197Sminshall * field, so just look at the next byte. 87131197Sminshall */ 87231197Sminshall if (IsStartField(i)) { 87331197Sminshall i = ScreenInc(i); 87431192Sminshall } else { 87531197Sminshall i = ScreenInc(FieldInc(i)); 87631192Sminshall } 87731197Sminshall } while (i != j); 87831197Sminshall if (!IsUnProtected(i)) { /* couldn't find unprotected */ 87931197Sminshall i = SetBufferAddress(0,0); 88031197Sminshall } 88131197Sminshall if (OptLeftMargin <= ScreenLineOffset(CursorAddress)) { 88231197Sminshall if (IsUnProtected(SetBufferAddress(ScreenLine(i), 88331197Sminshall OptLeftMargin))) { 88431197Sminshall i = SetBufferAddress(ScreenLine(i), OptLeftMargin); 88531197Sminshall } 88631197Sminshall } 88731197Sminshall CursorAddress = i; 88831197Sminshall break; 88930015Sminshall 89031197Sminshall case FCN_EINP: 89131197Sminshall if (!FormattedScreen()) { 89231197Sminshall i = CursorAddress; 89331197Sminshall TurnOffMdt(i); 89430015Sminshall do { 89531197Sminshall AddHost(i, 0); 89631197Sminshall i = ScreenInc(i); 89731197Sminshall } while (i != CursorAddress); 89831197Sminshall } else { 89931197Sminshall /* 90031197Sminshall * The algorithm is: go through each unprotected 90131197Sminshall * field on the screen, clearing it out. When 90231197Sminshall * we are at the start of a field, skip that field 90331197Sminshall * if its contents are protected. 90430015Sminshall */ 90531197Sminshall i = j = FieldInc(CursorAddress); 90631197Sminshall do { 90731197Sminshall if (IsUnProtected(ScreenInc(i))) { 90830015Sminshall i = ScreenInc(i); 90931197Sminshall TurnOffMdt(i); 91031197Sminshall do { 91131197Sminshall AddHost(i, 0); 91231197Sminshall i = ScreenInc(i); 91331197Sminshall } while (!IsStartField(i)); 91430015Sminshall } else { 91531197Sminshall i = FieldInc(i); 91630015Sminshall } 91730015Sminshall } while (i != j); 91831197Sminshall } 91931197Sminshall Home(); 92031197Sminshall break; 92130015Sminshall 92231197Sminshall case FCN_EEOF: 92331197Sminshall EraseEndOfField(); 92431197Sminshall break; 92530015Sminshall 92631197Sminshall case FCN_SPACE: 92731197Sminshall OneCharacter(DISP_BLANK, InsertMode); /* Add cent */ 92831197Sminshall break; 92930015Sminshall 93031197Sminshall case FCN_CENTSIGN: 93131197Sminshall OneCharacter(DISP_CENTSIGN, InsertMode); /* Add cent */ 93231197Sminshall break; 93330015Sminshall 93431197Sminshall case FCN_FM: 93531197Sminshall OneCharacter(DISP_FM, InsertMode); /* Add field mark */ 93631197Sminshall break; 93730015Sminshall 93831197Sminshall case FCN_DP: 93931197Sminshall if (IsProtected(CursorAddress)) { 94031197Sminshall RingBell("Protected Field"); 94131197Sminshall } else { 94231197Sminshall OneCharacter(DISP_DUP, InsertMode);/* Add dup character */ 94331197Sminshall Tab(); 94431197Sminshall } 94531197Sminshall break; 94630015Sminshall 94731197Sminshall case FCN_TAB: 94831197Sminshall Tab(); 94931197Sminshall break; 95030015Sminshall 95131197Sminshall case FCN_BTAB: 95231197Sminshall BackTab(); 95331197Sminshall break; 95430015Sminshall 95530015Sminshall #ifdef NOTUSED /* Actually, this is superseded by unix flow 95631197Sminshall * control. 95731197Sminshall */ 95831197Sminshall case FCN_XOFF: 95931197Sminshall Flow = 0; /* stop output */ 96031197Sminshall break; 96130015Sminshall 96231197Sminshall case FCN_XON: 96331197Sminshall if (!Flow) { 96431197Sminshall Flow = 1; /* turn it back on */ 96531197Sminshall DoTerminalOutput(); 96631197Sminshall } 96731197Sminshall break; 96830015Sminshall #endif /* NOTUSED */ 96930015Sminshall 97030327Sminshall #if !defined(PURE3274) 97131197Sminshall case FCN_ESCAPE: 97231197Sminshall /* FlushChar(); do we want to flush characters from before? */ 97331197Sminshall StopScreen(1); 97431197Sminshall command(0); 97531476Sminshall if (shell_active == 0) { 97631476Sminshall ConnectScreen(); 97731476Sminshall } 97831197Sminshall break; 97930015Sminshall 98031197Sminshall case FCN_DISC: 98131197Sminshall StopScreen(1); 98231197Sminshall suspend(); 98331197Sminshall setconnmode(); 98431197Sminshall ConnectScreen(); 98531197Sminshall break; 98630015Sminshall 98731197Sminshall case FCN_RESHOW: 98831197Sminshall RefreshScreen(); 98931197Sminshall break; 99030015Sminshall 99131197Sminshall case FCN_SETTAB: 99231197Sminshall OptColTabs[ScreenLineOffset(CursorAddress)] = 1; 99331197Sminshall break; 99430015Sminshall 99531197Sminshall case FCN_DELTAB: 99631197Sminshall OptColTabs[ScreenLineOffset(CursorAddress)] = 0; 99731197Sminshall break; 99830015Sminshall 99931197Sminshall /* 100031197Sminshall * Clear all tabs, home line, and left margin. 100131197Sminshall */ 100231197Sminshall case FCN_CLRTAB: 100331197Sminshall for (i = 0; i < sizeof OptColTabs; i++) { 100431197Sminshall OptColTabs[i] = 0; 100531197Sminshall } 100631197Sminshall OptHome = 0; 100731197Sminshall OptLeftMargin = 0; 100831197Sminshall break; 100930015Sminshall 101031197Sminshall case FCN_COLTAB: 101131197Sminshall ColTab(); 101231197Sminshall break; 101330015Sminshall 101431197Sminshall case FCN_COLBAK: 101531197Sminshall ColBak(); 101631197Sminshall break; 101730015Sminshall 101831197Sminshall case FCN_INDENT: 101931197Sminshall ColTab(); 102031197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 102131197Sminshall break; 102230015Sminshall 102331197Sminshall case FCN_UNDENT: 102431197Sminshall ColBak(); 102531197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 102631197Sminshall break; 102730015Sminshall 102831197Sminshall case FCN_SETMRG: 102931197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 103031197Sminshall break; 103130015Sminshall 103231197Sminshall case FCN_SETHOM: 103331197Sminshall OptHome = ScreenLine(CursorAddress); 103431197Sminshall break; 103530015Sminshall 103631197Sminshall /* 103731197Sminshall * Point to first character of next unprotected word on 103831197Sminshall * screen. 103931197Sminshall */ 104031197Sminshall case FCN_WORDTAB: 104131197Sminshall i = CursorAddress; 104231197Sminshall SetXIsProtected(); 104331197Sminshall while (!XIsProtected(i) && !Disspace(GetHost(i))) { 104431197Sminshall i = ScreenInc(i); 104531197Sminshall if (i == CursorAddress) { 104631197Sminshall break; 104730015Sminshall } 104831197Sminshall } 104931197Sminshall /* i is either protected, a space (blank or null), 105031197Sminshall * or wrapped 105131197Sminshall */ 105231197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 105331197Sminshall i = ScreenInc(i); 105431197Sminshall if (i == CursorAddress) { 105531197Sminshall break; 105630015Sminshall } 105731197Sminshall } 105831197Sminshall CursorAddress = i; 105931197Sminshall break; 106030015Sminshall 106131197Sminshall case FCN_WORDBACKTAB: 106231197Sminshall i = ScreenDec(CursorAddress); 106331197Sminshall SetXIsProtected(); 106431197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 106531197Sminshall i = ScreenDec(i); 106631197Sminshall if (i == CursorAddress) { 106731197Sminshall break; 106830015Sminshall } 106931197Sminshall } 107031197Sminshall /* i is pointing to a character IN an unprotected word 107131197Sminshall * (or i wrapped) 107231197Sminshall */ 107331197Sminshall while (!Disspace(GetHost(i))) { 107431197Sminshall i = ScreenDec(i); 107531197Sminshall if (i == CursorAddress) { 107631197Sminshall break; 107730015Sminshall } 107831197Sminshall } 107931197Sminshall CursorAddress = ScreenInc(i); 108031197Sminshall break; 108130015Sminshall 108231197Sminshall /* Point to last non-blank character of this/next 108331197Sminshall * unprotected word. 108431197Sminshall */ 108531197Sminshall case FCN_WORDEND: 108631197Sminshall i = ScreenInc(CursorAddress); 108731197Sminshall SetXIsProtected(); 108831197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 108931197Sminshall i = ScreenInc(i); 109031197Sminshall if (i == CursorAddress) { 109131197Sminshall break; 109230015Sminshall } 109331197Sminshall } 109431197Sminshall /* we are pointing at a character IN an 109531197Sminshall * unprotected word (or we wrapped) 109631197Sminshall */ 109731197Sminshall while (!Disspace(GetHost(i))) { 109831197Sminshall i = ScreenInc(i); 109931197Sminshall if (i == CursorAddress) { 110031197Sminshall break; 110130015Sminshall } 110231197Sminshall } 110331197Sminshall CursorAddress = ScreenDec(i); 110431197Sminshall break; 110530015Sminshall 110631197Sminshall /* Get to last non-blank of this/next unprotected 110731197Sminshall * field. 110831197Sminshall */ 110931197Sminshall case FCN_FIELDEND: 111031197Sminshall i = LastOfField(CursorAddress); 111131197Sminshall if (i != CursorAddress) { 111231197Sminshall CursorAddress = i; /* We moved; take this */ 111331197Sminshall } else { 111431197Sminshall j = FieldInc(CursorAddress); /* Move to next field */ 111531197Sminshall i = LastOfField(j); 111631197Sminshall if (i != j) { 111731197Sminshall CursorAddress = i; /* We moved; take this */ 111830015Sminshall } 111931197Sminshall /* else - nowhere else on screen to be; stay here */ 112031197Sminshall } 112131197Sminshall break; 112230327Sminshall #endif /* !defined(PURE3274) */ 112330015Sminshall 112431197Sminshall default: 112531197Sminshall /* We don't handle this yet */ 112631197Sminshall RingBell("Function not implemented"); 112731197Sminshall } 112831197Sminshall } 112931197Sminshall return 1; /* We did something! */ 113031197Sminshall } 113131197Sminshall 113231197Sminshall 113331197Sminshall /* 113431197Sminshall * We get data from the terminal. We keep track of the shift state 113531197Sminshall * (including ALT, CONTROL), and then call AcceptKeystroke to actually 113631197Sminshall * process any non-shift keys. 113731197Sminshall */ 113831197Sminshall 113931197Sminshall int 114031197Sminshall DataFrom3270(buffer, count) 114131197Sminshall unsigned char *buffer; /* where the data is */ 114231197Sminshall int count; /* how much data there is */ 114331197Sminshall { 114431197Sminshall int origCount; 114531197Sminshall 114631197Sminshall origCount = count; 114731197Sminshall 114831197Sminshall while (count) { 114931197Sminshall if (*buffer >= numberof(hits)) { 115035421Sminshall ExitString("Unknown scancode encountered in DataFrom3270.\n", 1); 115131197Sminshall /*NOTREACHED*/ 115231197Sminshall } 115331197Sminshall 115431197Sminshall switch (hits[*buffer].hit[HITNUM(rememberedshiftstate)].ctlrfcn) { 115531197Sminshall 115631197Sminshall case FCN_MAKE_SHIFT: 115731197Sminshall rememberedshiftstate |= (SHIFT_RIGHT|SHIFT_UPSHIFT); 115831197Sminshall break; 115931197Sminshall case FCN_BREAK_SHIFT: 116031197Sminshall rememberedshiftstate &= ~(SHIFT_RIGHT|SHIFT_UPSHIFT); 116131197Sminshall break; 116231197Sminshall case FCN_MAKE_ALT: 116331197Sminshall rememberedshiftstate |= SHIFT_ALT; 116431197Sminshall break; 116531197Sminshall case FCN_BREAK_ALT: 116631197Sminshall rememberedshiftstate &= ~SHIFT_ALT; 116731197Sminshall break; 116831197Sminshall default: 116931197Sminshall if (AcceptKeystroke(*buffer, rememberedshiftstate) == 0) { 117031197Sminshall return(origCount-count); 117130015Sminshall } 117231197Sminshall break; 117330015Sminshall } 117431197Sminshall buffer++; 117531197Sminshall count--; 117630015Sminshall } 117730015Sminshall return(origCount-count); 117830015Sminshall } 1179