1*48756Sbostic /*- 2*48756Sbostic * Copyright (c) 1988 The Regents of the University of California. 333816Sbostic * All rights reserved. 430015Sminshall * 5*48756Sbostic * %sccs.include.redist.c% 630015Sminshall */ 730015Sminshall 833816Sbostic #ifndef lint 9*48756Sbostic static char sccsid[] = "@(#)inbound.c 4.3 (Berkeley) 04/26/91"; 1033816Sbostic #endif /* not lint */ 1134887Sbostic 1231085Sminshall #include <stdio.h> 1331085Sminshall 1431177Sminshall #include "../general/general.h" 1530015Sminshall #include "function.h" 1630015Sminshall #include "hostctlr.h" 1731192Sminshall #include "oia.h" 1830015Sminshall #include "scrnctlr.h" 1930015Sminshall #include "screen.h" 2030015Sminshall #include "options.h" 2131871Sminshall #include "../api/dctype.h" 2231871Sminshall #include "../api/ebc_disp.h" 2330015Sminshall 2431177Sminshall #include "../general/globals.h" 2535421Sminshall #include "externs.h" 2635421Sminshall #include "declare.h" 2730015Sminshall 2830015Sminshall #define EmptyChar() (ourPTail == ourPHead) 2930015Sminshall #define FullChar() (ourPHead == ourBuffer+sizeof ourBuffer) 3030015Sminshall 3130015Sminshall 3230015Sminshall /* 3330015Sminshall * We define something to allow us to to IsProtected() quickly 3430015Sminshall * on unformatted screens (with the current algorithm for fields, 3530015Sminshall * unprotected takes exponential time...). 3630015Sminshall * 3730015Sminshall * The idea is to call SetXIsProtected() BEFORE the 3830015Sminshall * loop, then use XIsProtected(). 3930015Sminshall */ 4030015Sminshall 4130361Sminshall #define SetXIsProtected() (XWasSF = 1) 4230361Sminshall #define XIsProtected(p) (IsStartField(p)? \ 4330361Sminshall XWasSF = 1 : \ 4430361Sminshall (XWasSF? \ 4530361Sminshall (XWasSF = 0, XProtected = IsProtected(p)) : \ 4630361Sminshall XProtected)) 4730015Sminshall 4830015Sminshall static char ourBuffer[400]; 4930015Sminshall 5030015Sminshall static char *ourPHead = ourBuffer, 5130015Sminshall *ourPTail = ourBuffer; 5230015Sminshall 5330327Sminshall static int HadAid; /* Had an AID haven't sent */ 5430015Sminshall 5530327Sminshall static int InsertMode; /* is the terminal in insert mode? */ 5630327Sminshall 5735421Sminshall static unsigned int 5835421Sminshall rememberedshiftstate; /* Shift (alt) state of terminal */ 5935421Sminshall 6031197Sminshall # define HITNUM(s) ((((s)&(SHIFT_CAPS|SHIFT_UPSHIFT))? 1:0) \ 6131197Sminshall + ((((s)&SHIFT_ALT)? 1:0)<<1)) 6231197Sminshall 6330361Sminshall static int XWasSF, XProtected; /* For optimizations */ 6430076Sminshall #if !defined(PURE3274) 6530076Sminshall extern int TransparentClock, OutputClock; 6630076Sminshall #endif /* !defined(PURE3274) */ 6730076Sminshall 6830327Sminshall #include "kbd.out" /* Get keyboard mapping function */ 6930015Sminshall 7030015Sminshall /* the following are global variables */ 7130015Sminshall 7230015Sminshall extern int UnLocked; /* keyboard is UnLocked? */ 7330015Sminshall 7430724Sminshall 7530724Sminshall /* 7630724Sminshall * init_inbound : 7730724Sminshall * 7830724Sminshall * Reset variables to initial state. 7930724Sminshall */ 8030724Sminshall 8130724Sminshall void 8230724Sminshall init_inbound() 8330724Sminshall { 8430724Sminshall ourPHead = ourPTail = ourBuffer; 8530724Sminshall HadAid = 0; 8631197Sminshall rememberedshiftstate = 0; 8730724Sminshall InsertMode = 0; 8830724Sminshall } 8930724Sminshall 9030724Sminshall 9130015Sminshall /* Tab() - sets cursor to the start of the next unprotected field */ 9230015Sminshall static void 9330015Sminshall Tab() 9430015Sminshall { 9530015Sminshall register int i, j; 9630015Sminshall 9730015Sminshall i = CursorAddress; 9830015Sminshall j = WhereAttrByte(CursorAddress); 9930015Sminshall do { 10030015Sminshall if (IsStartField(i) && IsUnProtected(ScreenInc(i))) { 10130015Sminshall break; 10230015Sminshall } 10330015Sminshall i = FieldInc(i); 10430015Sminshall } while (i != j); 10530015Sminshall if (IsStartField(i) && IsUnProtected(ScreenInc(i))) { 10630015Sminshall CursorAddress = ScreenInc(i); 10730015Sminshall } else { 10830015Sminshall CursorAddress = SetBufferAddress(0,0); 10930015Sminshall } 11030015Sminshall } 11130015Sminshall 11230015Sminshall 11330015Sminshall /* BackTab() - sets cursor to the start of the most recent field */ 11430015Sminshall 11530015Sminshall static void 11630015Sminshall BackTab() 11730015Sminshall { 11830015Sminshall register int i; 11930015Sminshall 12030015Sminshall i = ScreenDec(CursorAddress); 12130015Sminshall for (;;) { 12230015Sminshall if (IsStartField(ScreenDec(i)) && IsUnProtected(i)) { 12330015Sminshall CursorAddress = i; 12430015Sminshall break; 12530015Sminshall } 12630015Sminshall if (i == CursorAddress) { 12730015Sminshall CursorAddress = SetBufferAddress(0,0); 12830015Sminshall break; 12930015Sminshall } 13030015Sminshall i = ScreenDec(i); 13130015Sminshall } 13230015Sminshall } 13330015Sminshall 13433752Sminshall /* 13533752Sminshall * ModifyMdt() - Turn a modified data tag bit on or off (watch 13633752Sminshall * out for unformatted screens). 13733752Sminshall */ 13830015Sminshall 13933752Sminshall ModifyMdt(x,on) 14033752Sminshall int x; 14133752Sminshall int on; 14233752Sminshall { 14333752Sminshall int i = x; 14433752Sminshall 14533752Sminshall if (IsStartField(i)) { /* If we are at a start field position... */ 14633752Sminshall if (on) { 14733752Sminshall ModifyHost(i, |= ATTR_MDT); /* Turn it on */ 14833752Sminshall } else { 14933752Sminshall ModifyHost(i, &= ~ATTR_MDT); /* Turn it off */ 15033752Sminshall } 15133752Sminshall } else { 15233752Sminshall i = WhereAttrByte(i); /* Find beginning of field */ 15333752Sminshall if (IsStartField(i)) { /* Is there one? */ 15433752Sminshall if (on) { 15533752Sminshall ModifyHost(i, |= ATTR_MDT); /* Turn it on */ 15633752Sminshall } else { 15733752Sminshall ModifyHost(i, &= ~ATTR_MDT); /* Turn it off */ 15833752Sminshall } 15933752Sminshall } /* else, don't modify - this is an unformatted screen */ 16033752Sminshall } 16133752Sminshall } 16233752Sminshall 16333752Sminshall 16430015Sminshall /* EraseEndOfField - erase all characters to the end of a field */ 16530015Sminshall 16630015Sminshall static void 16730015Sminshall EraseEndOfField() 16830015Sminshall { 16930015Sminshall register int i; 17030015Sminshall 17130015Sminshall if (IsProtected(CursorAddress)) { 17230015Sminshall RingBell("Protected Field"); 17330015Sminshall } else { 17430015Sminshall TurnOnMdt(CursorAddress); 17530015Sminshall if (FormattedScreen()) { 17630015Sminshall i = CursorAddress; 17730015Sminshall do { 17830015Sminshall AddHost(i, 0); 17930015Sminshall i = ScreenInc(i); 18030015Sminshall } while ((i != CursorAddress) && !IsStartField(i)); 18130015Sminshall } else { /* Screen is Unformatted */ 18230015Sminshall i = CursorAddress; 18330015Sminshall do { 18430015Sminshall AddHost(i, 0); 18530015Sminshall i = ScreenInc(i); 18630015Sminshall } while (i != HighestScreen()); 18730015Sminshall } 18830015Sminshall } 18930015Sminshall } 19030015Sminshall 19130015Sminshall /* Delete() - deletes a character from the screen 19230015Sminshall * 19330015Sminshall * What we want to do is delete the section 19430015Sminshall * [where, from-1] from the screen, 19530015Sminshall * filling in with what comes at from. 19630015Sminshall * 19730015Sminshall * The deleting continues to the end of the field (or 19830015Sminshall * until the cursor wraps). 19930015Sminshall * 20030015Sminshall * From can be a start of a field. We 20130015Sminshall * check for that. However, there can't be any 20230015Sminshall * fields that start between where and from. 20330015Sminshall * We don't check for that. 20430015Sminshall * 20530015Sminshall * Also, we assume that the protection status of 20630015Sminshall * everything has been checked by the caller. 20730015Sminshall * 20830015Sminshall */ 20930015Sminshall 21030015Sminshall static void 21130015Sminshall Delete(where, from) 21230015Sminshall register int where, /* Where to start deleting from */ 21330015Sminshall from; /* Where to pull back from */ 21430015Sminshall { 21530015Sminshall register int i; 21630015Sminshall 21730015Sminshall TurnOnMdt(where); /* Only do this once in this field */ 21830015Sminshall i = where; 21930015Sminshall do { 22030015Sminshall if (IsStartField(from)) { 22130015Sminshall AddHost(i, 0); /* Stick the edge at the start field */ 22230015Sminshall } else { 22335421Sminshall AddHost(i, (char)GetHost(from)); 22430015Sminshall from = ScreenInc(from); /* Move the edge */ 22530015Sminshall } 22630015Sminshall i = ScreenInc(i); 22730015Sminshall } while ((!IsStartField(i)) && (i != where)); 22830015Sminshall } 22930015Sminshall 23030015Sminshall static void 23130015Sminshall ColBak() 23230015Sminshall { 23330015Sminshall register int i; 23430015Sminshall 23530015Sminshall i = ScreenLineOffset(CursorAddress); 23630015Sminshall for (i = i-1; i >= 0; i--) { 23730015Sminshall if (OptColTabs[i]) { 23830015Sminshall break; 23930015Sminshall } 24030015Sminshall } 24130015Sminshall if (i < 0) { 24230015Sminshall i = 0; 24330015Sminshall } 24430015Sminshall CursorAddress = SetBufferAddress(ScreenLine(CursorAddress), i); 24530015Sminshall } 24630015Sminshall 24730015Sminshall static void 24830015Sminshall ColTab() 24930015Sminshall { 25030015Sminshall register int i; 25130015Sminshall 25230015Sminshall i = ScreenLineOffset(CursorAddress); 25330015Sminshall for (i = i+1; i < NumberColumns; i++) { 25430015Sminshall if (OptColTabs[i]) { 25530015Sminshall break; 25630015Sminshall } 25730015Sminshall } 25830015Sminshall if (i >= NumberColumns) { 25930015Sminshall i = NumberColumns-1; 26030015Sminshall } 26130015Sminshall CursorAddress = SetBufferAddress(ScreenLine(CursorAddress), i); 26230015Sminshall } 26330015Sminshall 26430015Sminshall static void 26530015Sminshall Home() 26630015Sminshall { 26730015Sminshall register int i; 26830015Sminshall register int j; 26930015Sminshall 27030015Sminshall i = SetBufferAddress(OptHome, 0); 27130015Sminshall j = WhereLowByte(i); 27239469Sminshall /* 27339469Sminshall * If the initial value of i points to the field attribute of 27439469Sminshall * an unprotected field, we need to return the address of the 27539469Sminshall * first data byte in the field (assuming there are any!). 27639469Sminshall */ 27739469Sminshall if (IsStartField(i) && IsUnProtected(j)) { 27839469Sminshall CursorAddress = j; 27939469Sminshall return; 28039469Sminshall } 28130015Sminshall do { 28230015Sminshall if (IsUnProtected(i)) { 28330015Sminshall CursorAddress = i; 28430015Sminshall return; 28530015Sminshall } 28630015Sminshall /* the following could be a problem if we got here with an 28730015Sminshall * unformatted screen. However, this is "impossible", since 28830015Sminshall * with an unformatted screen, the IsUnProtected(i) above 28930015Sminshall * should be true. 29030015Sminshall */ 29130015Sminshall i = ScreenInc(FieldInc(i)); 29230015Sminshall } while (i != j); 29330015Sminshall CursorAddress = LowestScreen(); 29430015Sminshall } 29530015Sminshall 29630015Sminshall static 29730015Sminshall LastOfField(i) 29830015Sminshall register int i; /* position to start from */ 29930015Sminshall { 30030015Sminshall register int j; 30130015Sminshall register int k; 30230015Sminshall 30330015Sminshall k = j = i; 30430015Sminshall SetXIsProtected(); 30530015Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 30630015Sminshall i = ScreenInc(i); 30730015Sminshall if (i == j) { 30830015Sminshall break; 30930015Sminshall } 31030015Sminshall } 31130015Sminshall /* We are now IN a word IN an unprotected field (or wrapped) */ 31230015Sminshall while (!XIsProtected(i)) { 31330015Sminshall if (!Disspace(GetHost(i))) { 31430015Sminshall k = i; 31530015Sminshall } 31630015Sminshall i = ScreenInc(i); 31730015Sminshall if (i == j) { 31830015Sminshall break; 31930015Sminshall } 32030015Sminshall } 32130015Sminshall return(k); 32230015Sminshall } 32330015Sminshall 32430015Sminshall 32530015Sminshall static void 32630015Sminshall FlushChar() 32730015Sminshall { 32830015Sminshall ourPTail = ourPHead = ourBuffer; 32930015Sminshall } 33030015Sminshall 33130015Sminshall 33230015Sminshall /* 33330015Sminshall * Add one EBCDIC (NOT display code) character to the buffer. 33430015Sminshall */ 33530015Sminshall 33630015Sminshall static void 33730015Sminshall AddChar(character) 33830015Sminshall char character; 33930015Sminshall { 34030015Sminshall if (FullChar()) { 34130015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 0); 34230015Sminshall if (EmptyChar()) { 34330015Sminshall FlushChar(); 34430015Sminshall } else { 34530073Sminshall char buffer[100]; 34630073Sminshall 34730073Sminshall sprintf(buffer, "File %s, line %d: No room in network buffer!\n", 34830015Sminshall __FILE__, __LINE__); 34935421Sminshall ExitString(buffer, 1); 35030073Sminshall /*NOTREACHED*/ 35130015Sminshall } 35230015Sminshall } 35330015Sminshall *ourPHead++ = character; 35430015Sminshall } 35530015Sminshall 35630015Sminshall 35730015Sminshall static void 35830015Sminshall SendUnformatted() 35930015Sminshall { 36030015Sminshall register int i, j; 36130015Sminshall register int Nulls; 36230015Sminshall register int c; 36330015Sminshall 36430015Sminshall /* look for start of field */ 36530015Sminshall Nulls = 0; 36630015Sminshall i = j = LowestScreen(); 36730015Sminshall do { 36830015Sminshall c = GetHost(i); 36930015Sminshall if (c == 0) { 37030015Sminshall Nulls++; 37130015Sminshall } else { 37230015Sminshall while (Nulls) { 37330015Sminshall Nulls--; 37430015Sminshall AddChar(EBCDIC_BLANK); /* put in blanks */ 37530015Sminshall } 37635421Sminshall AddChar((char)disp_ebc[c]); 37730015Sminshall } 37830015Sminshall i = ScreenInc(i); 37930015Sminshall } while (i != j); 38030015Sminshall } 38130015Sminshall 38230015Sminshall static 38335421Sminshall SendField(i, cmd) 38430015Sminshall register int i; /* where we saw MDT bit */ 38535421Sminshall int cmd; /* The command code (type of read) */ 38630015Sminshall { 38730015Sminshall register int j; 38830015Sminshall register int k; 38930015Sminshall register int Nulls; 39030015Sminshall register int c; 39130015Sminshall 39230015Sminshall /* look for start of field */ 39330015Sminshall i = j = WhereLowByte(i); 39430015Sminshall 39530015Sminshall /* On a test_request_read, don't send sba and address */ 39630015Sminshall if ((AidByte != AID_TREQ) 39735421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 39830015Sminshall AddChar(ORDER_SBA); /* set start field */ 39930015Sminshall AddChar(BufferTo3270_0(j)); /* set address of this field */ 40030015Sminshall AddChar(BufferTo3270_1(j)); 40130015Sminshall } 40230015Sminshall /* 40330015Sminshall * Only on read_modified_all do we return the contents 40430015Sminshall * of the field when the attention was caused by a 40530015Sminshall * selector pen. 40630015Sminshall */ 40730015Sminshall if ((AidByte != AID_SELPEN) 40835421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 40930015Sminshall if (!IsStartField(j)) { 41030015Sminshall Nulls = 0; 41130015Sminshall k = ScreenInc(WhereHighByte(j)); 41230015Sminshall do { 41330015Sminshall c = GetHost(j); 41430015Sminshall if (c == 0) { 41530015Sminshall Nulls++; 41630015Sminshall } else { 41730015Sminshall while (Nulls) { 41830015Sminshall Nulls--; 41930015Sminshall AddChar(EBCDIC_BLANK); /* put in blanks */ 42030015Sminshall } 42135421Sminshall AddChar((char)disp_ebc[c]); 42230015Sminshall } 42330015Sminshall j = ScreenInc(j); 42430015Sminshall } while ((j != k) && (j != i)); 42530015Sminshall } 42630015Sminshall } else { 42730015Sminshall j = FieldInc(j); 42830015Sminshall } 42930015Sminshall return(j); 43030015Sminshall } 43130015Sminshall 43230015Sminshall /* Various types of reads... */ 43330015Sminshall void 43435421Sminshall DoReadModified(cmd) 43535421Sminshall int cmd; /* The command sent */ 43630015Sminshall { 43730015Sminshall register int i, j; 43830015Sminshall 43930015Sminshall if (AidByte) { 44030015Sminshall if (AidByte != AID_TREQ) { 44130015Sminshall AddChar(AidByte); 44230015Sminshall } else { 44330015Sminshall /* Test Request Read header */ 44430015Sminshall AddChar(EBCDIC_SOH); 44530015Sminshall AddChar(EBCDIC_PERCENT); 44630015Sminshall AddChar(EBCDIC_SLASH); 44730015Sminshall AddChar(EBCDIC_STX); 44830015Sminshall } 44930015Sminshall } else { 45030015Sminshall AddChar(AID_NONE); 45130015Sminshall } 45230015Sminshall if (((AidByte != AID_PA1) && (AidByte != AID_PA2) 45330015Sminshall && (AidByte != AID_PA3) && (AidByte != AID_CLEAR)) 45435421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 45530015Sminshall if ((AidByte != AID_TREQ) 45635421Sminshall || (cmd == CMD_SNA_READ_MODIFIED_ALL)) { 45730015Sminshall /* Test request read_modified doesn't give cursor address */ 45830015Sminshall AddChar(BufferTo3270_0(CursorAddress)); 45930015Sminshall AddChar(BufferTo3270_1(CursorAddress)); 46030015Sminshall } 46130015Sminshall i = j = WhereAttrByte(LowestScreen()); 46230015Sminshall /* Is this an unformatted screen? */ 46330015Sminshall if (!IsStartField(i)) { /* yes, handle separate */ 46430015Sminshall SendUnformatted(); 46530015Sminshall } else { 46630015Sminshall do { 46730015Sminshall if (HasMdt(i)) { 46835421Sminshall i = SendField(i, cmd); 46930015Sminshall } else { 47030015Sminshall i = FieldInc(i); 47130015Sminshall } 47230015Sminshall } while (i != j); 47330015Sminshall } 47430015Sminshall } 47530015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 47630015Sminshall if (EmptyChar()) { 47730015Sminshall FlushChar(); 47830015Sminshall HadAid = 0; /* killed that buffer */ 47930015Sminshall } 48030015Sminshall } 48130015Sminshall 48230015Sminshall /* A read buffer operation... */ 48330015Sminshall 48430015Sminshall void 48530015Sminshall DoReadBuffer() 48630015Sminshall { 48730015Sminshall register int i, j; 48830015Sminshall 48930015Sminshall if (AidByte) { 49030015Sminshall AddChar(AidByte); 49130015Sminshall } else { 49230015Sminshall AddChar(AID_NONE); 49330015Sminshall } 49430015Sminshall AddChar(BufferTo3270_0(CursorAddress)); 49530015Sminshall AddChar(BufferTo3270_1(CursorAddress)); 49630015Sminshall i = j = LowestScreen(); 49730015Sminshall do { 49830015Sminshall if (IsStartField(i)) { 49930015Sminshall AddChar(ORDER_SF); 50030015Sminshall AddChar(BufferTo3270_1(FieldAttributes(i))); 50130015Sminshall } else { 50235421Sminshall AddChar((char)disp_ebc[GetHost(i)]); 50330015Sminshall } 50430015Sminshall i = ScreenInc(i); 50530015Sminshall } while (i != j); 50630015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 50730015Sminshall if (EmptyChar()) { 50830015Sminshall FlushChar(); 50930015Sminshall HadAid = 0; /* killed that buffer */ 51030015Sminshall } 51130015Sminshall } 51231864Sminshall 51331864Sminshall /* Send some transparent data to the host */ 51431864Sminshall 51531864Sminshall void 51631864Sminshall SendTransparent(buffer, count) 51731864Sminshall char *buffer; 51831864Sminshall int count; 51931864Sminshall { 52031864Sminshall char stuff[3]; 52131864Sminshall 52231864Sminshall stuff[0] = AID_NONE_PRINTER; 52331864Sminshall stuff[1] = BufferTo3270_0(count); 52431864Sminshall stuff[2] = BufferTo3270_1(count); 52531864Sminshall DataToNetwork(stuff, sizeof stuff, 0); 52631864Sminshall DataToNetwork(buffer, count, 1); 52731864Sminshall } 52831864Sminshall 52931864Sminshall 53030015Sminshall /* Try to send some data to host */ 53130015Sminshall 53230015Sminshall void 53330015Sminshall SendToIBM() 53430015Sminshall { 53530076Sminshall #if !defined(PURE3274) 53631864Sminshall if (TransparentClock >= OutputClock) { 53730015Sminshall if (HadAid) { 53830015Sminshall AddChar(AidByte); 53930015Sminshall HadAid = 0; 54030015Sminshall } else { 54130015Sminshall AddChar(AID_NONE_PRINTER); 54230015Sminshall } 54330015Sminshall do { 54430015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 54530015Sminshall } while (!EmptyChar()); 54630015Sminshall FlushChar(); 54730015Sminshall } else if (HadAid) { 54830015Sminshall DoReadModified(CMD_READ_MODIFIED); 54930015Sminshall } 55030076Sminshall #else /* !defined(PURE3274) */ 55130076Sminshall if (HadAid) { 55230076Sminshall DoReadModified(CMD_READ_MODIFIED); 55330076Sminshall } 55430076Sminshall #endif /* !defined(PURE3274) */ 55530015Sminshall } 55630015Sminshall 55730015Sminshall /* This takes in one character from the keyboard and places it on the 55830015Sminshall * screen. 55930015Sminshall */ 56030015Sminshall 56130015Sminshall static void 56230015Sminshall OneCharacter(c, insert) 56330015Sminshall int c; /* character (Ebcdic) to be shoved in */ 56430015Sminshall int insert; /* are we in insert mode? */ 56530015Sminshall { 56630015Sminshall register int i, j; 56730015Sminshall 56830015Sminshall if (IsProtected(CursorAddress)) { 56930015Sminshall RingBell("Protected Field"); 57030015Sminshall return; 57130015Sminshall } 57230015Sminshall if (insert) { 57330015Sminshall /* is the last character in the field a blank or null? */ 57430015Sminshall i = ScreenDec(FieldInc(CursorAddress)); 57530015Sminshall j = GetHost(i); 57630015Sminshall if (!Disspace(j)) { 57730015Sminshall RingBell("No more room for insert"); 57830015Sminshall return; 57930015Sminshall } else { 58030015Sminshall for (j = ScreenDec(i); i != CursorAddress; 58130015Sminshall j = ScreenDec(j), i = ScreenDec(i)) { 58235421Sminshall AddHost(i, (char)GetHost(j)); 58330015Sminshall } 58430015Sminshall } 58530015Sminshall } 58630015Sminshall AddHost(CursorAddress, c); 58730015Sminshall TurnOnMdt(CursorAddress); 58830015Sminshall CursorAddress = ScreenInc(CursorAddress); 58930015Sminshall if (IsStartField(CursorAddress) && 59030015Sminshall ((FieldAttributes(CursorAddress)&ATTR_AUTO_SKIP_MASK) == 59130015Sminshall ATTR_AUTO_SKIP_VALUE)) { 59230015Sminshall Tab(); 59330015Sminshall } 59430015Sminshall } 59530015Sminshall 59631197Sminshall /* 59731197Sminshall * AcceptKeystroke() 59831197Sminshall * 59931197Sminshall * Processes one keystroke. 60031197Sminshall * 60131197Sminshall * Returns: 60231197Sminshall * 60331197Sminshall * 0 if this keystroke was NOT processed. 60431197Sminshall * 1 if everything went OK. 60531197Sminshall */ 60630015Sminshall 60730015Sminshall int 60831197Sminshall AcceptKeystroke(scancode, shiftstate) 60935421Sminshall unsigned int 61031197Sminshall scancode, /* 3270 scancode */ 61131197Sminshall shiftstate; /* The shift state */ 61230015Sminshall { 61330015Sminshall register int c; 61430015Sminshall register int i; 61530015Sminshall register int j; 61630076Sminshall enum ctlrfcn ctlrfcn; 61730015Sminshall 61831197Sminshall if (scancode >= numberof(hits)) { 61935421Sminshall ExitString( 62031197Sminshall "Unknown scancode encountered in AcceptKeystroke.\n", 1); 62130015Sminshall /*NOTREACHED*/ 62230015Sminshall } 62331197Sminshall ctlrfcn = hits[scancode].hit[HITNUM(shiftstate)].ctlrfcn; 62431197Sminshall c = hits[scancode].hit[HITNUM(shiftstate)].code; 62530015Sminshall 62630015Sminshall if (!UnLocked || HadAid) { 62730015Sminshall if (HadAid) { 62830015Sminshall SendToIBM(); 62930015Sminshall if (!EmptyChar()) { 63031197Sminshall return 0; /* nothing to do */ 63130015Sminshall } 63230015Sminshall } 63330327Sminshall #if !defined(PURE3274) 63430015Sminshall if (!HadAid && EmptyChar()) { 63530076Sminshall if ((ctlrfcn == FCN_RESET) || (ctlrfcn == FCN_MASTER_RESET)) { 63630015Sminshall UnLocked = 1; 63730015Sminshall } 63830015Sminshall } 63930327Sminshall #endif /* !defined(PURE3274) */ 64030015Sminshall if (!UnLocked) { 64131197Sminshall return 0; 64230015Sminshall } 64330015Sminshall } 64431864Sminshall 64530015Sminshall /* now, either empty, or haven't seen aid yet */ 64630015Sminshall 64730076Sminshall #if !defined(PURE3274) 64831864Sminshall /* 64931864Sminshall * If we are in transparent (output) mode, do something special 65031864Sminshall * with keystrokes. 65131864Sminshall */ 65230015Sminshall if (TransparentClock == OutputClock) { 65331197Sminshall if (ctlrfcn == FCN_AID) { 65431197Sminshall UnLocked = 0; 65531197Sminshall InsertMode = 0; 65631197Sminshall AidByte = (c); 65731197Sminshall HadAid = 1; 65831197Sminshall } else { 65931197Sminshall switch (ctlrfcn) { 66031197Sminshall case FCN_ESCAPE: 66131197Sminshall StopScreen(1); 66231197Sminshall command(0); 66331476Sminshall if (shell_active == 0) { 66431476Sminshall ConnectScreen(); 66531476Sminshall } 66631197Sminshall break; 66730015Sminshall 66831197Sminshall case FCN_RESET: 66931197Sminshall case FCN_MASTER_RESET: 67031197Sminshall UnLocked = 1; 67131197Sminshall break; 67230015Sminshall 67331197Sminshall default: 67431197Sminshall return 0; 67530015Sminshall } 67630015Sminshall } 67730015Sminshall } 67830076Sminshall #endif /* !defined(PURE3274) */ 67930015Sminshall 68031197Sminshall if (ctlrfcn == FCN_CHARACTER) { 68131197Sminshall /* Add the character to the buffer */ 68231197Sminshall OneCharacter(c, InsertMode); 68331197Sminshall } else if (ctlrfcn == FCN_AID) { /* got Aid */ 68431197Sminshall if (c == AID_CLEAR) { 68531197Sminshall LocalClearScreen(); /* Side effect is to clear 3270 */ 68630015Sminshall } 68731197Sminshall ResetOiaOnlineA(&OperatorInformationArea); 68831197Sminshall SetOiaTWait(&OperatorInformationArea); 68931197Sminshall ResetOiaInsert(&OperatorInformationArea); 69031197Sminshall InsertMode = 0; /* just like a 3278 */ 69131197Sminshall SetOiaSystemLocked(&OperatorInformationArea); 69231197Sminshall SetOiaModified(); 69331197Sminshall UnLocked = 0; 69431197Sminshall AidByte = c; 69531197Sminshall HadAid = 1; 69631197Sminshall SendToIBM(); 69731197Sminshall } else { 69831197Sminshall switch (ctlrfcn) { 69930015Sminshall 70031197Sminshall case FCN_CURSEL: 70131197Sminshall c = FieldAttributes(CursorAddress)&ATTR_DSPD_MASK; 70231197Sminshall if (!FormattedScreen() 70331197Sminshall || ((c != ATTR_DSPD_DSPD) && (c != ATTR_DSPD_HIGH))) { 70431197Sminshall RingBell("Cursor not in selectable field"); 70531197Sminshall } else { 70631197Sminshall i = ScreenInc(WhereAttrByte(CursorAddress)); 70731197Sminshall c = GetHost(i); 70831197Sminshall if (c == DISP_QUESTION) { 70931197Sminshall AddHost(i, DISP_GREATER_THAN); 71031197Sminshall TurnOnMdt(i); 71131197Sminshall } else if (c == DISP_GREATER_THAN) { 71231197Sminshall AddHost(i, DISP_QUESTION); 71331197Sminshall TurnOffMdt(i); 71431197Sminshall } else if (c == DISP_BLANK || c == DISP_NULL 71531197Sminshall || c == DISP_AMPERSAND) { 71631197Sminshall UnLocked = 0; 71731197Sminshall InsertMode = 0; 71831197Sminshall ResetOiaOnlineA(&OperatorInformationArea); 71931197Sminshall SetOiaTWait(&OperatorInformationArea); 72031197Sminshall SetOiaSystemLocked(&OperatorInformationArea); 72131197Sminshall ResetOiaInsert(&OperatorInformationArea); 72231197Sminshall SetOiaModified(); 72331197Sminshall if (c == DISP_AMPERSAND) { 72431197Sminshall TurnOnMdt(i); /* Only for & type */ 72531197Sminshall AidByte = AID_ENTER; 72630015Sminshall } else { 72731197Sminshall AidByte = AID_SELPEN; 72830015Sminshall } 72931197Sminshall HadAid = 1; 73031197Sminshall SendToIBM(); 73131197Sminshall } else { 73231197Sminshall RingBell( 73331197Sminshall "Cursor not in a selectable field (designator)"); 73430015Sminshall } 73531197Sminshall } 73631197Sminshall break; 73730015Sminshall 73830327Sminshall #if !defined(PURE3274) 73931197Sminshall case FCN_ERASE: 74031197Sminshall if (IsProtected(ScreenDec(CursorAddress))) { 74131197Sminshall RingBell("Protected Field"); 74231197Sminshall } else { 74331197Sminshall CursorAddress = ScreenDec(CursorAddress); 74431197Sminshall Delete(CursorAddress, ScreenInc(CursorAddress)); 74531197Sminshall } 74631197Sminshall break; 74731197Sminshall case FCN_WERASE: 74831197Sminshall j = CursorAddress; 74931197Sminshall i = ScreenDec(j); 75031197Sminshall if (IsProtected(i)) { 75131197Sminshall RingBell("Protected Field"); 75231197Sminshall } else { 75331197Sminshall SetXIsProtected(); 75431197Sminshall while ((!XIsProtected(i) && Disspace(GetHost(i))) 75531197Sminshall && (i != j)) { 75631197Sminshall i = ScreenDec(i); 75730015Sminshall } 75831197Sminshall /* we are pointing at a character in a word, or 75931197Sminshall * at a protected position 76031197Sminshall */ 76131197Sminshall while ((!XIsProtected(i) && !Disspace(GetHost(i))) 76231197Sminshall && (i != j)) { 76331197Sminshall i = ScreenDec(i); 76430015Sminshall } 76531197Sminshall /* we are pointing at a space, or at a protected 76631197Sminshall * position 76731197Sminshall */ 76831197Sminshall CursorAddress = ScreenInc(i); 76931197Sminshall Delete(CursorAddress, j); 77031197Sminshall } 77131197Sminshall break; 77230015Sminshall 77331197Sminshall case FCN_FERASE: 77431197Sminshall if (IsProtected(CursorAddress)) { 77531197Sminshall RingBell("Protected Field"); 77631197Sminshall } else { 77731197Sminshall CursorAddress = ScreenInc(CursorAddress); /* for btab */ 77831197Sminshall BackTab(); 77931197Sminshall EraseEndOfField(); 78031197Sminshall } 78131197Sminshall break; 78230015Sminshall 78331197Sminshall case FCN_RESET: 78431197Sminshall if (InsertMode) { 78531197Sminshall InsertMode = 0; 78631197Sminshall ResetOiaInsert(&OperatorInformationArea); 78731197Sminshall SetOiaModified(); 78831197Sminshall } 78931197Sminshall break; 79031197Sminshall case FCN_MASTER_RESET: 79131197Sminshall if (InsertMode) { 79231197Sminshall InsertMode = 0; 79331197Sminshall ResetOiaInsert(&OperatorInformationArea); 79431197Sminshall SetOiaModified(); 79531197Sminshall } 79631197Sminshall RefreshScreen(); 79731197Sminshall break; 79830327Sminshall #endif /* !defined(PURE3274) */ 79930015Sminshall 80031197Sminshall case FCN_UP: 80131197Sminshall CursorAddress = ScreenUp(CursorAddress); 80231197Sminshall break; 80330015Sminshall 80431197Sminshall case FCN_LEFT: 80531197Sminshall CursorAddress = ScreenDec(CursorAddress); 80631197Sminshall break; 80730015Sminshall 80831197Sminshall case FCN_RIGHT: 80931197Sminshall CursorAddress = ScreenInc(CursorAddress); 81031197Sminshall break; 81130015Sminshall 81231197Sminshall case FCN_DOWN: 81331197Sminshall CursorAddress = ScreenDown(CursorAddress); 81431197Sminshall break; 81530015Sminshall 81631197Sminshall case FCN_DELETE: 81731197Sminshall if (IsProtected(CursorAddress)) { 81831197Sminshall RingBell("Protected Field"); 81931197Sminshall } else { 82031197Sminshall Delete(CursorAddress, ScreenInc(CursorAddress)); 82131197Sminshall } 82231197Sminshall break; 82331197Sminshall 82431197Sminshall case FCN_INSRT: 82531197Sminshall InsertMode = !InsertMode; 82631197Sminshall if (InsertMode) { 82731197Sminshall SetOiaInsert(&OperatorInformationArea); 82831197Sminshall } else { 82931197Sminshall ResetOiaInsert(&OperatorInformationArea); 83031197Sminshall } 83131197Sminshall SetOiaModified(); 83231197Sminshall break; 83331197Sminshall 83431197Sminshall case FCN_HOME: 83531197Sminshall Home(); 83631197Sminshall break; 83731197Sminshall 83831197Sminshall case FCN_NL: 83931197Sminshall /* The algorithm is to look for the first unprotected 84031197Sminshall * column after column 0 of the following line. Having 84131197Sminshall * found that unprotected column, we check whether the 84231197Sminshall * cursor-address-at-entry is at or to the right of the 84331197Sminshall * LeftMargin AND the LeftMargin column of the found line 84431197Sminshall * is unprotected. If this conjunction is true, then 84531197Sminshall * we set the found pointer to the address of the LeftMargin 84631197Sminshall * column in the found line. 84731197Sminshall * Then, we set the cursor address to the found address. 84831197Sminshall */ 84931197Sminshall i = SetBufferAddress(ScreenLine(ScreenDown(CursorAddress)), 0); 85031197Sminshall j = ScreenInc(WhereAttrByte(CursorAddress)); 85131197Sminshall do { 85231197Sminshall if (IsUnProtected(i)) { 85331197Sminshall break; 85430015Sminshall } 85531197Sminshall /* Again (see comment in Home()), this COULD be a problem 85631197Sminshall * with an unformatted screen. 85731197Sminshall */ 85831197Sminshall /* If there was a field with only an attribute byte, 85931197Sminshall * we may be pointing to the attribute byte of the NEXT 86031197Sminshall * field, so just look at the next byte. 86131197Sminshall */ 86231197Sminshall if (IsStartField(i)) { 86331197Sminshall i = ScreenInc(i); 86431192Sminshall } else { 86531197Sminshall i = ScreenInc(FieldInc(i)); 86631192Sminshall } 86731197Sminshall } while (i != j); 86831197Sminshall if (!IsUnProtected(i)) { /* couldn't find unprotected */ 86931197Sminshall i = SetBufferAddress(0,0); 87031197Sminshall } 87131197Sminshall if (OptLeftMargin <= ScreenLineOffset(CursorAddress)) { 87231197Sminshall if (IsUnProtected(SetBufferAddress(ScreenLine(i), 87331197Sminshall OptLeftMargin))) { 87431197Sminshall i = SetBufferAddress(ScreenLine(i), OptLeftMargin); 87531197Sminshall } 87631197Sminshall } 87731197Sminshall CursorAddress = i; 87831197Sminshall break; 87930015Sminshall 88031197Sminshall case FCN_EINP: 88131197Sminshall if (!FormattedScreen()) { 88231197Sminshall i = CursorAddress; 88331197Sminshall TurnOffMdt(i); 88430015Sminshall do { 88531197Sminshall AddHost(i, 0); 88631197Sminshall i = ScreenInc(i); 88731197Sminshall } while (i != CursorAddress); 88831197Sminshall } else { 88931197Sminshall /* 89031197Sminshall * The algorithm is: go through each unprotected 89131197Sminshall * field on the screen, clearing it out. When 89231197Sminshall * we are at the start of a field, skip that field 89331197Sminshall * if its contents are protected. 89430015Sminshall */ 89531197Sminshall i = j = FieldInc(CursorAddress); 89631197Sminshall do { 89731197Sminshall if (IsUnProtected(ScreenInc(i))) { 89830015Sminshall i = ScreenInc(i); 89931197Sminshall TurnOffMdt(i); 90031197Sminshall do { 90131197Sminshall AddHost(i, 0); 90231197Sminshall i = ScreenInc(i); 90331197Sminshall } while (!IsStartField(i)); 90430015Sminshall } else { 90531197Sminshall i = FieldInc(i); 90630015Sminshall } 90730015Sminshall } while (i != j); 90831197Sminshall } 90931197Sminshall Home(); 91031197Sminshall break; 91130015Sminshall 91231197Sminshall case FCN_EEOF: 91331197Sminshall EraseEndOfField(); 91431197Sminshall break; 91530015Sminshall 91631197Sminshall case FCN_SPACE: 91731197Sminshall OneCharacter(DISP_BLANK, InsertMode); /* Add cent */ 91831197Sminshall break; 91930015Sminshall 92031197Sminshall case FCN_CENTSIGN: 92131197Sminshall OneCharacter(DISP_CENTSIGN, InsertMode); /* Add cent */ 92231197Sminshall break; 92330015Sminshall 92431197Sminshall case FCN_FM: 92531197Sminshall OneCharacter(DISP_FM, InsertMode); /* Add field mark */ 92631197Sminshall break; 92730015Sminshall 92831197Sminshall case FCN_DP: 92931197Sminshall if (IsProtected(CursorAddress)) { 93031197Sminshall RingBell("Protected Field"); 93131197Sminshall } else { 93231197Sminshall OneCharacter(DISP_DUP, InsertMode);/* Add dup character */ 93331197Sminshall Tab(); 93431197Sminshall } 93531197Sminshall break; 93630015Sminshall 93731197Sminshall case FCN_TAB: 93831197Sminshall Tab(); 93931197Sminshall break; 94030015Sminshall 94131197Sminshall case FCN_BTAB: 94231197Sminshall BackTab(); 94331197Sminshall break; 94430015Sminshall 94530015Sminshall #ifdef NOTUSED /* Actually, this is superseded by unix flow 94631197Sminshall * control. 94731197Sminshall */ 94831197Sminshall case FCN_XOFF: 94931197Sminshall Flow = 0; /* stop output */ 95031197Sminshall break; 95130015Sminshall 95231197Sminshall case FCN_XON: 95331197Sminshall if (!Flow) { 95431197Sminshall Flow = 1; /* turn it back on */ 95531197Sminshall DoTerminalOutput(); 95631197Sminshall } 95731197Sminshall break; 95830015Sminshall #endif /* NOTUSED */ 95930015Sminshall 96030327Sminshall #if !defined(PURE3274) 96131197Sminshall case FCN_ESCAPE: 96231197Sminshall /* FlushChar(); do we want to flush characters from before? */ 96331197Sminshall StopScreen(1); 96431197Sminshall command(0); 96531476Sminshall if (shell_active == 0) { 96631476Sminshall ConnectScreen(); 96731476Sminshall } 96831197Sminshall break; 96930015Sminshall 97031197Sminshall case FCN_DISC: 97131197Sminshall StopScreen(1); 97231197Sminshall suspend(); 97331197Sminshall setconnmode(); 97431197Sminshall ConnectScreen(); 97531197Sminshall break; 97630015Sminshall 97731197Sminshall case FCN_RESHOW: 97831197Sminshall RefreshScreen(); 97931197Sminshall break; 98030015Sminshall 98131197Sminshall case FCN_SETTAB: 98231197Sminshall OptColTabs[ScreenLineOffset(CursorAddress)] = 1; 98331197Sminshall break; 98430015Sminshall 98531197Sminshall case FCN_DELTAB: 98631197Sminshall OptColTabs[ScreenLineOffset(CursorAddress)] = 0; 98731197Sminshall break; 98830015Sminshall 98931197Sminshall /* 99031197Sminshall * Clear all tabs, home line, and left margin. 99131197Sminshall */ 99231197Sminshall case FCN_CLRTAB: 99331197Sminshall for (i = 0; i < sizeof OptColTabs; i++) { 99431197Sminshall OptColTabs[i] = 0; 99531197Sminshall } 99631197Sminshall OptHome = 0; 99731197Sminshall OptLeftMargin = 0; 99831197Sminshall break; 99930015Sminshall 100031197Sminshall case FCN_COLTAB: 100131197Sminshall ColTab(); 100231197Sminshall break; 100330015Sminshall 100431197Sminshall case FCN_COLBAK: 100531197Sminshall ColBak(); 100631197Sminshall break; 100730015Sminshall 100831197Sminshall case FCN_INDENT: 100931197Sminshall ColTab(); 101031197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 101131197Sminshall break; 101230015Sminshall 101331197Sminshall case FCN_UNDENT: 101431197Sminshall ColBak(); 101531197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 101631197Sminshall break; 101730015Sminshall 101831197Sminshall case FCN_SETMRG: 101931197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 102031197Sminshall break; 102130015Sminshall 102231197Sminshall case FCN_SETHOM: 102331197Sminshall OptHome = ScreenLine(CursorAddress); 102431197Sminshall break; 102530015Sminshall 102631197Sminshall /* 102731197Sminshall * Point to first character of next unprotected word on 102831197Sminshall * screen. 102931197Sminshall */ 103031197Sminshall case FCN_WORDTAB: 103131197Sminshall i = CursorAddress; 103231197Sminshall SetXIsProtected(); 103331197Sminshall while (!XIsProtected(i) && !Disspace(GetHost(i))) { 103431197Sminshall i = ScreenInc(i); 103531197Sminshall if (i == CursorAddress) { 103631197Sminshall break; 103730015Sminshall } 103831197Sminshall } 103931197Sminshall /* i is either protected, a space (blank or null), 104031197Sminshall * or wrapped 104131197Sminshall */ 104231197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 104331197Sminshall i = ScreenInc(i); 104431197Sminshall if (i == CursorAddress) { 104531197Sminshall break; 104630015Sminshall } 104731197Sminshall } 104831197Sminshall CursorAddress = i; 104931197Sminshall break; 105030015Sminshall 105131197Sminshall case FCN_WORDBACKTAB: 105231197Sminshall i = ScreenDec(CursorAddress); 105331197Sminshall SetXIsProtected(); 105431197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 105531197Sminshall i = ScreenDec(i); 105631197Sminshall if (i == CursorAddress) { 105731197Sminshall break; 105830015Sminshall } 105931197Sminshall } 106031197Sminshall /* i is pointing to a character IN an unprotected word 106131197Sminshall * (or i wrapped) 106231197Sminshall */ 106331197Sminshall while (!Disspace(GetHost(i))) { 106431197Sminshall i = ScreenDec(i); 106531197Sminshall if (i == CursorAddress) { 106631197Sminshall break; 106730015Sminshall } 106831197Sminshall } 106931197Sminshall CursorAddress = ScreenInc(i); 107031197Sminshall break; 107130015Sminshall 107231197Sminshall /* Point to last non-blank character of this/next 107331197Sminshall * unprotected word. 107431197Sminshall */ 107531197Sminshall case FCN_WORDEND: 107631197Sminshall i = ScreenInc(CursorAddress); 107731197Sminshall SetXIsProtected(); 107831197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 107931197Sminshall i = ScreenInc(i); 108031197Sminshall if (i == CursorAddress) { 108131197Sminshall break; 108230015Sminshall } 108331197Sminshall } 108431197Sminshall /* we are pointing at a character IN an 108531197Sminshall * unprotected word (or we wrapped) 108631197Sminshall */ 108731197Sminshall while (!Disspace(GetHost(i))) { 108831197Sminshall i = ScreenInc(i); 108931197Sminshall if (i == CursorAddress) { 109031197Sminshall break; 109130015Sminshall } 109231197Sminshall } 109331197Sminshall CursorAddress = ScreenDec(i); 109431197Sminshall break; 109530015Sminshall 109631197Sminshall /* Get to last non-blank of this/next unprotected 109731197Sminshall * field. 109831197Sminshall */ 109931197Sminshall case FCN_FIELDEND: 110031197Sminshall i = LastOfField(CursorAddress); 110131197Sminshall if (i != CursorAddress) { 110231197Sminshall CursorAddress = i; /* We moved; take this */ 110331197Sminshall } else { 110431197Sminshall j = FieldInc(CursorAddress); /* Move to next field */ 110531197Sminshall i = LastOfField(j); 110631197Sminshall if (i != j) { 110731197Sminshall CursorAddress = i; /* We moved; take this */ 110830015Sminshall } 110931197Sminshall /* else - nowhere else on screen to be; stay here */ 111031197Sminshall } 111131197Sminshall break; 111230327Sminshall #endif /* !defined(PURE3274) */ 111330015Sminshall 111431197Sminshall default: 111531197Sminshall /* We don't handle this yet */ 111631197Sminshall RingBell("Function not implemented"); 111731197Sminshall } 111831197Sminshall } 111931197Sminshall return 1; /* We did something! */ 112031197Sminshall } 112131197Sminshall 112231197Sminshall 112331197Sminshall /* 112431197Sminshall * We get data from the terminal. We keep track of the shift state 112531197Sminshall * (including ALT, CONTROL), and then call AcceptKeystroke to actually 112631197Sminshall * process any non-shift keys. 112731197Sminshall */ 112831197Sminshall 112931197Sminshall int 113031197Sminshall DataFrom3270(buffer, count) 113131197Sminshall unsigned char *buffer; /* where the data is */ 113231197Sminshall int count; /* how much data there is */ 113331197Sminshall { 113431197Sminshall int origCount; 113531197Sminshall 113631197Sminshall origCount = count; 113731197Sminshall 113831197Sminshall while (count) { 113931197Sminshall if (*buffer >= numberof(hits)) { 114035421Sminshall ExitString("Unknown scancode encountered in DataFrom3270.\n", 1); 114131197Sminshall /*NOTREACHED*/ 114231197Sminshall } 114331197Sminshall 114431197Sminshall switch (hits[*buffer].hit[HITNUM(rememberedshiftstate)].ctlrfcn) { 114531197Sminshall 114631197Sminshall case FCN_MAKE_SHIFT: 114731197Sminshall rememberedshiftstate |= (SHIFT_RIGHT|SHIFT_UPSHIFT); 114831197Sminshall break; 114931197Sminshall case FCN_BREAK_SHIFT: 115031197Sminshall rememberedshiftstate &= ~(SHIFT_RIGHT|SHIFT_UPSHIFT); 115131197Sminshall break; 115231197Sminshall case FCN_MAKE_ALT: 115331197Sminshall rememberedshiftstate |= SHIFT_ALT; 115431197Sminshall break; 115531197Sminshall case FCN_BREAK_ALT: 115631197Sminshall rememberedshiftstate &= ~SHIFT_ALT; 115731197Sminshall break; 115831197Sminshall default: 115931197Sminshall if (AcceptKeystroke(*buffer, rememberedshiftstate) == 0) { 116031197Sminshall return(origCount-count); 116130015Sminshall } 116231197Sminshall break; 116330015Sminshall } 116431197Sminshall buffer++; 116531197Sminshall count--; 116630015Sminshall } 116730015Sminshall return(origCount-count); 116830015Sminshall } 1169