130015Sminshall /* 230015Sminshall * Copyright (c) 1984, 1985, 1986 by the Regents of the 330015Sminshall * University of California and by Gregory Glenn Minshall. 430015Sminshall * 530015Sminshall * Permission to use, copy, modify, and distribute these 630015Sminshall * programs and their documentation for any purpose and 730015Sminshall * without fee is hereby granted, provided that this 830015Sminshall * copyright and permission appear on all copies and 930015Sminshall * supporting documentation, the name of the Regents of 1030015Sminshall * the University of California not be used in advertising 1130015Sminshall * or publicity pertaining to distribution of the programs 1230015Sminshall * without specific prior permission, and notice be given in 1330015Sminshall * supporting documentation that copying and distribution is 1430015Sminshall * by permission of the Regents of the University of California 1530015Sminshall * and by Gregory Glenn Minshall. Neither the Regents of the 1630015Sminshall * University of California nor Gregory Glenn Minshall make 1730015Sminshall * representations about the suitability of this software 1830015Sminshall * for any purpose. It is provided "as is" without 1930015Sminshall * express or implied warranty. 2030015Sminshall */ 2130015Sminshall 2230015Sminshall 2330015Sminshall #ifndef lint 2430015Sminshall static char sccsid[] = "@(#)inbound.c 3.1 10/29/86"; 2530015Sminshall #endif /* ndef lint */ 2630015Sminshall 2730015Sminshall 2831085Sminshall #include <stdio.h> 2931085Sminshall 3031177Sminshall #include "../general/general.h" 3130015Sminshall #include "function.h" 3230015Sminshall #include "hostctlr.h" 3331192Sminshall #include "oia.h" 3430015Sminshall #include "scrnctlr.h" 3530015Sminshall #include "screen.h" 3630015Sminshall #include "options.h" 3730015Sminshall #include "dctype.h" 3830015Sminshall #include "ebc_disp.h" 3930015Sminshall 4031177Sminshall #include "../general/globals.h" 4130015Sminshall #include "inbound.ext" 4230015Sminshall #include "outbound.ext" 4330015Sminshall #include "../telnet.ext" 4430015Sminshall 4530015Sminshall #define EmptyChar() (ourPTail == ourPHead) 4630015Sminshall #define FullChar() (ourPHead == ourBuffer+sizeof ourBuffer) 4730015Sminshall 4830015Sminshall 4930015Sminshall /* 5030015Sminshall * We define something to allow us to to IsProtected() quickly 5130015Sminshall * on unformatted screens (with the current algorithm for fields, 5230015Sminshall * unprotected takes exponential time...). 5330015Sminshall * 5430015Sminshall * The idea is to call SetXIsProtected() BEFORE the 5530015Sminshall * loop, then use XIsProtected(). 5630015Sminshall */ 5730015Sminshall 5830361Sminshall #define SetXIsProtected() (XWasSF = 1) 5930361Sminshall #define XIsProtected(p) (IsStartField(p)? \ 6030361Sminshall XWasSF = 1 : \ 6130361Sminshall (XWasSF? \ 6230361Sminshall (XWasSF = 0, XProtected = IsProtected(p)) : \ 6330361Sminshall XProtected)) 6430015Sminshall 6530015Sminshall static char ourBuffer[400]; 6630015Sminshall 6730015Sminshall static char *ourPHead = ourBuffer, 6830015Sminshall *ourPTail = ourBuffer; 6930015Sminshall 7030327Sminshall static int HadAid; /* Had an AID haven't sent */ 7130015Sminshall 7230327Sminshall static int InsertMode; /* is the terminal in insert mode? */ 7330327Sminshall 74*31197Sminshall static int rememberedshiftstate; /* Shift (alt) state of terminal */ 75*31197Sminshall # define HITNUM(s) ((((s)&(SHIFT_CAPS|SHIFT_UPSHIFT))? 1:0) \ 76*31197Sminshall + ((((s)&SHIFT_ALT)? 1:0)<<1)) 77*31197Sminshall 7830361Sminshall static int XWasSF, XProtected; /* For optimizations */ 7930076Sminshall #if !defined(PURE3274) 8030076Sminshall extern int TransparentClock, OutputClock; 8130076Sminshall #endif /* !defined(PURE3274) */ 8230076Sminshall 8330327Sminshall #include "kbd.out" /* Get keyboard mapping function */ 8430015Sminshall 8530015Sminshall /* the following are global variables */ 8630015Sminshall 8730015Sminshall extern int UnLocked; /* keyboard is UnLocked? */ 8830015Sminshall 8930724Sminshall 9030724Sminshall /* 9130724Sminshall * init_inbound : 9230724Sminshall * 9330724Sminshall * Reset variables to initial state. 9430724Sminshall */ 9530724Sminshall 9630724Sminshall void 9730724Sminshall init_inbound() 9830724Sminshall { 9930724Sminshall ourPHead = ourPTail = ourBuffer; 10030724Sminshall HadAid = 0; 101*31197Sminshall rememberedshiftstate = 0; 10230724Sminshall InsertMode = 0; 10330724Sminshall } 10430724Sminshall 10530724Sminshall 10630015Sminshall /* Tab() - sets cursor to the start of the next unprotected field */ 10730015Sminshall static void 10830015Sminshall Tab() 10930015Sminshall { 11030015Sminshall register int i, j; 11130015Sminshall 11230015Sminshall i = CursorAddress; 11330015Sminshall j = WhereAttrByte(CursorAddress); 11430015Sminshall do { 11530015Sminshall if (IsStartField(i) && IsUnProtected(ScreenInc(i))) { 11630015Sminshall break; 11730015Sminshall } 11830015Sminshall i = FieldInc(i); 11930015Sminshall } while (i != j); 12030015Sminshall if (IsStartField(i) && IsUnProtected(ScreenInc(i))) { 12130015Sminshall CursorAddress = ScreenInc(i); 12230015Sminshall } else { 12330015Sminshall CursorAddress = SetBufferAddress(0,0); 12430015Sminshall } 12530015Sminshall } 12630015Sminshall 12730015Sminshall 12830015Sminshall /* BackTab() - sets cursor to the start of the most recent field */ 12930015Sminshall 13030015Sminshall static void 13130015Sminshall BackTab() 13230015Sminshall { 13330015Sminshall register int i; 13430015Sminshall 13530015Sminshall i = ScreenDec(CursorAddress); 13630015Sminshall for (;;) { 13730015Sminshall if (IsStartField(ScreenDec(i)) && IsUnProtected(i)) { 13830015Sminshall CursorAddress = i; 13930015Sminshall break; 14030015Sminshall } 14130015Sminshall if (i == CursorAddress) { 14230015Sminshall CursorAddress = SetBufferAddress(0,0); 14330015Sminshall break; 14430015Sminshall } 14530015Sminshall i = ScreenDec(i); 14630015Sminshall } 14730015Sminshall } 14830015Sminshall 14930015Sminshall 15030015Sminshall /* EraseEndOfField - erase all characters to the end of a field */ 15130015Sminshall 15230015Sminshall static void 15330015Sminshall EraseEndOfField() 15430015Sminshall { 15530015Sminshall register int i; 15630015Sminshall 15730015Sminshall if (IsProtected(CursorAddress)) { 15830015Sminshall RingBell("Protected Field"); 15930015Sminshall } else { 16030015Sminshall TurnOnMdt(CursorAddress); 16130015Sminshall if (FormattedScreen()) { 16230015Sminshall i = CursorAddress; 16330015Sminshall do { 16430015Sminshall AddHost(i, 0); 16530015Sminshall i = ScreenInc(i); 16630015Sminshall } while ((i != CursorAddress) && !IsStartField(i)); 16730015Sminshall } else { /* Screen is Unformatted */ 16830015Sminshall i = CursorAddress; 16930015Sminshall do { 17030015Sminshall AddHost(i, 0); 17130015Sminshall i = ScreenInc(i); 17230015Sminshall } while (i != HighestScreen()); 17330015Sminshall } 17430015Sminshall } 17530015Sminshall } 17630015Sminshall 17730015Sminshall /* Delete() - deletes a character from the screen 17830015Sminshall * 17930015Sminshall * What we want to do is delete the section 18030015Sminshall * [where, from-1] from the screen, 18130015Sminshall * filling in with what comes at from. 18230015Sminshall * 18330015Sminshall * The deleting continues to the end of the field (or 18430015Sminshall * until the cursor wraps). 18530015Sminshall * 18630015Sminshall * From can be a start of a field. We 18730015Sminshall * check for that. However, there can't be any 18830015Sminshall * fields that start between where and from. 18930015Sminshall * We don't check for that. 19030015Sminshall * 19130015Sminshall * Also, we assume that the protection status of 19230015Sminshall * everything has been checked by the caller. 19330015Sminshall * 19430015Sminshall */ 19530015Sminshall 19630015Sminshall static void 19730015Sminshall Delete(where, from) 19830015Sminshall register int where, /* Where to start deleting from */ 19930015Sminshall from; /* Where to pull back from */ 20030015Sminshall { 20130015Sminshall register int i; 20230015Sminshall 20330015Sminshall TurnOnMdt(where); /* Only do this once in this field */ 20430015Sminshall i = where; 20530015Sminshall do { 20630015Sminshall if (IsStartField(from)) { 20730015Sminshall AddHost(i, 0); /* Stick the edge at the start field */ 20830015Sminshall } else { 20930015Sminshall AddHost(i, GetHost(from)); 21030015Sminshall from = ScreenInc(from); /* Move the edge */ 21130015Sminshall } 21230015Sminshall i = ScreenInc(i); 21330015Sminshall } while ((!IsStartField(i)) && (i != where)); 21430015Sminshall } 21530015Sminshall 21630015Sminshall static void 21730015Sminshall ColBak() 21830015Sminshall { 21930015Sminshall register int i; 22030015Sminshall 22130015Sminshall i = ScreenLineOffset(CursorAddress); 22230015Sminshall for (i = i-1; i >= 0; i--) { 22330015Sminshall if (OptColTabs[i]) { 22430015Sminshall break; 22530015Sminshall } 22630015Sminshall } 22730015Sminshall if (i < 0) { 22830015Sminshall i = 0; 22930015Sminshall } 23030015Sminshall CursorAddress = SetBufferAddress(ScreenLine(CursorAddress), i); 23130015Sminshall } 23230015Sminshall 23330015Sminshall static void 23430015Sminshall ColTab() 23530015Sminshall { 23630015Sminshall register int i; 23730015Sminshall 23830015Sminshall i = ScreenLineOffset(CursorAddress); 23930015Sminshall for (i = i+1; i < NumberColumns; i++) { 24030015Sminshall if (OptColTabs[i]) { 24130015Sminshall break; 24230015Sminshall } 24330015Sminshall } 24430015Sminshall if (i >= NumberColumns) { 24530015Sminshall i = NumberColumns-1; 24630015Sminshall } 24730015Sminshall CursorAddress = SetBufferAddress(ScreenLine(CursorAddress), i); 24830015Sminshall } 24930015Sminshall 25030015Sminshall static void 25130015Sminshall Home() 25230015Sminshall { 25330015Sminshall register int i; 25430015Sminshall register int j; 25530015Sminshall 25630015Sminshall i = SetBufferAddress(OptHome, 0); 25730015Sminshall j = WhereLowByte(i); 25830015Sminshall do { 25930015Sminshall if (IsUnProtected(i)) { 26030015Sminshall CursorAddress = i; 26130015Sminshall return; 26230015Sminshall } 26330015Sminshall /* the following could be a problem if we got here with an 26430015Sminshall * unformatted screen. However, this is "impossible", since 26530015Sminshall * with an unformatted screen, the IsUnProtected(i) above 26630015Sminshall * should be true. 26730015Sminshall */ 26830015Sminshall i = ScreenInc(FieldInc(i)); 26930015Sminshall } while (i != j); 27030015Sminshall CursorAddress = LowestScreen(); 27130015Sminshall } 27230015Sminshall 27330015Sminshall static 27430015Sminshall LastOfField(i) 27530015Sminshall register int i; /* position to start from */ 27630015Sminshall { 27730015Sminshall register int j; 27830015Sminshall register int k; 27930015Sminshall 28030015Sminshall k = j = i; 28130015Sminshall SetXIsProtected(); 28230015Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 28330015Sminshall i = ScreenInc(i); 28430015Sminshall if (i == j) { 28530015Sminshall break; 28630015Sminshall } 28730015Sminshall } 28830015Sminshall /* We are now IN a word IN an unprotected field (or wrapped) */ 28930015Sminshall while (!XIsProtected(i)) { 29030015Sminshall if (!Disspace(GetHost(i))) { 29130015Sminshall k = i; 29230015Sminshall } 29330015Sminshall i = ScreenInc(i); 29430015Sminshall if (i == j) { 29530015Sminshall break; 29630015Sminshall } 29730015Sminshall } 29830015Sminshall return(k); 29930015Sminshall } 30030015Sminshall 30130015Sminshall 30230015Sminshall static void 30330015Sminshall FlushChar() 30430015Sminshall { 30530015Sminshall ourPTail = ourPHead = ourBuffer; 30630015Sminshall } 30730015Sminshall 30830015Sminshall 30930015Sminshall /* 31030015Sminshall * Add one EBCDIC (NOT display code) character to the buffer. 31130015Sminshall */ 31230015Sminshall 31330015Sminshall static void 31430015Sminshall AddChar(character) 31530015Sminshall char character; 31630015Sminshall { 31730015Sminshall if (FullChar()) { 31830015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 0); 31930015Sminshall if (EmptyChar()) { 32030015Sminshall FlushChar(); 32130015Sminshall } else { 32230073Sminshall char buffer[100]; 32330073Sminshall 32430073Sminshall sprintf(buffer, "File %s, line %d: No room in network buffer!\n", 32530015Sminshall __FILE__, __LINE__); 32631085Sminshall ExitString(stderr, buffer, 1); 32730073Sminshall /*NOTREACHED*/ 32830015Sminshall } 32930015Sminshall } 33030015Sminshall *ourPHead++ = character; 33130015Sminshall } 33230015Sminshall 33330015Sminshall 33430015Sminshall static void 33530015Sminshall SendUnformatted() 33630015Sminshall { 33730015Sminshall register int i, j; 33830015Sminshall register int Nulls; 33930015Sminshall register int c; 34030015Sminshall 34130015Sminshall /* look for start of field */ 34230015Sminshall Nulls = 0; 34330015Sminshall i = j = LowestScreen(); 34430015Sminshall do { 34530015Sminshall c = GetHost(i); 34630015Sminshall if (c == 0) { 34730015Sminshall Nulls++; 34830015Sminshall } else { 34930015Sminshall while (Nulls) { 35030015Sminshall Nulls--; 35130015Sminshall AddChar(EBCDIC_BLANK); /* put in blanks */ 35230015Sminshall } 35330015Sminshall AddChar(disp_ebc[c]); 35430015Sminshall } 35530015Sminshall i = ScreenInc(i); 35630015Sminshall } while (i != j); 35730015Sminshall } 35830015Sminshall 35930015Sminshall static 36030015Sminshall SendField(i, command) 36130015Sminshall register int i; /* where we saw MDT bit */ 36230015Sminshall int command; /* The command code (type of read) */ 36330015Sminshall { 36430015Sminshall register int j; 36530015Sminshall register int k; 36630015Sminshall register int Nulls; 36730015Sminshall register int c; 36830015Sminshall 36930015Sminshall /* look for start of field */ 37030015Sminshall i = j = WhereLowByte(i); 37130015Sminshall 37230015Sminshall /* On a test_request_read, don't send sba and address */ 37330015Sminshall if ((AidByte != AID_TREQ) 37430015Sminshall || (command == CMD_SNA_READ_MODIFIED_ALL)) { 37530015Sminshall AddChar(ORDER_SBA); /* set start field */ 37630015Sminshall AddChar(BufferTo3270_0(j)); /* set address of this field */ 37730015Sminshall AddChar(BufferTo3270_1(j)); 37830015Sminshall } 37930015Sminshall /* 38030015Sminshall * Only on read_modified_all do we return the contents 38130015Sminshall * of the field when the attention was caused by a 38230015Sminshall * selector pen. 38330015Sminshall */ 38430015Sminshall if ((AidByte != AID_SELPEN) 38530015Sminshall || (command == CMD_SNA_READ_MODIFIED_ALL)) { 38630015Sminshall if (!IsStartField(j)) { 38730015Sminshall Nulls = 0; 38830015Sminshall k = ScreenInc(WhereHighByte(j)); 38930015Sminshall do { 39030015Sminshall c = GetHost(j); 39130015Sminshall if (c == 0) { 39230015Sminshall Nulls++; 39330015Sminshall } else { 39430015Sminshall while (Nulls) { 39530015Sminshall Nulls--; 39630015Sminshall AddChar(EBCDIC_BLANK); /* put in blanks */ 39730015Sminshall } 39830015Sminshall AddChar(disp_ebc[c]); 39930015Sminshall } 40030015Sminshall j = ScreenInc(j); 40130015Sminshall } while ((j != k) && (j != i)); 40230015Sminshall } 40330015Sminshall } else { 40430015Sminshall j = FieldInc(j); 40530015Sminshall } 40630015Sminshall return(j); 40730015Sminshall } 40830015Sminshall 40930015Sminshall /* Various types of reads... */ 41030015Sminshall void 41130015Sminshall DoReadModified(command) 41230015Sminshall int command; /* The command sent */ 41330015Sminshall { 41430015Sminshall register int i, j; 41530015Sminshall 41630015Sminshall if (AidByte) { 41730015Sminshall if (AidByte != AID_TREQ) { 41830015Sminshall AddChar(AidByte); 41930015Sminshall } else { 42030015Sminshall /* Test Request Read header */ 42130015Sminshall AddChar(EBCDIC_SOH); 42230015Sminshall AddChar(EBCDIC_PERCENT); 42330015Sminshall AddChar(EBCDIC_SLASH); 42430015Sminshall AddChar(EBCDIC_STX); 42530015Sminshall } 42630015Sminshall } else { 42730015Sminshall AddChar(AID_NONE); 42830015Sminshall } 42930015Sminshall if (((AidByte != AID_PA1) && (AidByte != AID_PA2) 43030015Sminshall && (AidByte != AID_PA3) && (AidByte != AID_CLEAR)) 43130015Sminshall || (command == CMD_SNA_READ_MODIFIED_ALL)) { 43230015Sminshall if ((AidByte != AID_TREQ) 43330015Sminshall || (command == CMD_SNA_READ_MODIFIED_ALL)) { 43430015Sminshall /* Test request read_modified doesn't give cursor address */ 43530015Sminshall AddChar(BufferTo3270_0(CursorAddress)); 43630015Sminshall AddChar(BufferTo3270_1(CursorAddress)); 43730015Sminshall } 43830015Sminshall i = j = WhereAttrByte(LowestScreen()); 43930015Sminshall /* Is this an unformatted screen? */ 44030015Sminshall if (!IsStartField(i)) { /* yes, handle separate */ 44130015Sminshall SendUnformatted(); 44230015Sminshall } else { 44330015Sminshall do { 44430015Sminshall if (HasMdt(i)) { 44530015Sminshall i = SendField(i, command); 44630015Sminshall } else { 44730015Sminshall i = FieldInc(i); 44830015Sminshall } 44930015Sminshall } while (i != j); 45030015Sminshall } 45130015Sminshall } 45230015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 45330015Sminshall if (EmptyChar()) { 45430015Sminshall FlushChar(); 45530015Sminshall HadAid = 0; /* killed that buffer */ 45630015Sminshall } 45730015Sminshall } 45830015Sminshall 45930015Sminshall /* A read buffer operation... */ 46030015Sminshall 46130015Sminshall void 46230015Sminshall DoReadBuffer() 46330015Sminshall { 46430015Sminshall register int i, j; 46530015Sminshall 46630015Sminshall if (AidByte) { 46730015Sminshall AddChar(AidByte); 46830015Sminshall } else { 46930015Sminshall AddChar(AID_NONE); 47030015Sminshall } 47130015Sminshall AddChar(BufferTo3270_0(CursorAddress)); 47230015Sminshall AddChar(BufferTo3270_1(CursorAddress)); 47330015Sminshall i = j = LowestScreen(); 47430015Sminshall do { 47530015Sminshall if (IsStartField(i)) { 47630015Sminshall AddChar(ORDER_SF); 47730015Sminshall AddChar(BufferTo3270_1(FieldAttributes(i))); 47830015Sminshall } else { 47930015Sminshall AddChar(disp_ebc[GetHost(i)]); 48030015Sminshall } 48130015Sminshall i = ScreenInc(i); 48230015Sminshall } while (i != j); 48330015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 48430015Sminshall if (EmptyChar()) { 48530015Sminshall FlushChar(); 48630015Sminshall HadAid = 0; /* killed that buffer */ 48730015Sminshall } 48830015Sminshall } 48930015Sminshall /* Try to send some data to host */ 49030015Sminshall 49130015Sminshall void 49230015Sminshall SendToIBM() 49330015Sminshall { 49430076Sminshall #if !defined(PURE3274) 49530015Sminshall if (TransparentClock == OutputClock) { 49630015Sminshall if (HadAid) { 49730015Sminshall AddChar(AidByte); 49830015Sminshall HadAid = 0; 49930015Sminshall } else { 50030015Sminshall AddChar(AID_NONE_PRINTER); 50130015Sminshall } 50230015Sminshall do { 50330015Sminshall ourPTail += DataToNetwork(ourPTail, ourPHead-ourPTail, 1); 50430015Sminshall } while (!EmptyChar()); 50530015Sminshall FlushChar(); 50630015Sminshall } else if (HadAid) { 50730015Sminshall DoReadModified(CMD_READ_MODIFIED); 50830015Sminshall } 50930076Sminshall #else /* !defined(PURE3274) */ 51030076Sminshall if (HadAid) { 51130076Sminshall DoReadModified(CMD_READ_MODIFIED); 51230076Sminshall } 51330076Sminshall #endif /* !defined(PURE3274) */ 51430015Sminshall } 51530015Sminshall 51630015Sminshall /* This takes in one character from the keyboard and places it on the 51730015Sminshall * screen. 51830015Sminshall */ 51930015Sminshall 52030015Sminshall static void 52130015Sminshall OneCharacter(c, insert) 52230015Sminshall int c; /* character (Ebcdic) to be shoved in */ 52330015Sminshall int insert; /* are we in insert mode? */ 52430015Sminshall { 52530015Sminshall register int i, j; 52630015Sminshall 52730015Sminshall if (IsProtected(CursorAddress)) { 52830015Sminshall RingBell("Protected Field"); 52930015Sminshall return; 53030015Sminshall } 53130015Sminshall if (insert) { 53230015Sminshall /* is the last character in the field a blank or null? */ 53330015Sminshall i = ScreenDec(FieldInc(CursorAddress)); 53430015Sminshall j = GetHost(i); 53530015Sminshall if (!Disspace(j)) { 53630015Sminshall RingBell("No more room for insert"); 53730015Sminshall return; 53830015Sminshall } else { 53930015Sminshall for (j = ScreenDec(i); i != CursorAddress; 54030015Sminshall j = ScreenDec(j), i = ScreenDec(i)) { 54130015Sminshall AddHost(i, GetHost(j)); 54230015Sminshall } 54330015Sminshall } 54430015Sminshall } 54530015Sminshall AddHost(CursorAddress, c); 54630015Sminshall TurnOnMdt(CursorAddress); 54730015Sminshall CursorAddress = ScreenInc(CursorAddress); 54830015Sminshall if (IsStartField(CursorAddress) && 54930015Sminshall ((FieldAttributes(CursorAddress)&ATTR_AUTO_SKIP_MASK) == 55030015Sminshall ATTR_AUTO_SKIP_VALUE)) { 55130015Sminshall Tab(); 55230015Sminshall } 55330015Sminshall } 55430015Sminshall 555*31197Sminshall /* 556*31197Sminshall * AcceptKeystroke() 557*31197Sminshall * 558*31197Sminshall * Processes one keystroke. 559*31197Sminshall * 560*31197Sminshall * Returns: 561*31197Sminshall * 562*31197Sminshall * 0 if this keystroke was NOT processed. 563*31197Sminshall * 1 if everything went OK. 564*31197Sminshall */ 56530015Sminshall 56630015Sminshall int 567*31197Sminshall AcceptKeystroke(scancode, shiftstate) 568*31197Sminshall int 569*31197Sminshall scancode, /* 3270 scancode */ 570*31197Sminshall shiftstate; /* The shift state */ 57130015Sminshall { 57230015Sminshall register int c; 57330015Sminshall register int i; 57430015Sminshall register int j; 57530076Sminshall enum ctlrfcn ctlrfcn; 57630015Sminshall 577*31197Sminshall if (scancode >= numberof(hits)) { 57831085Sminshall ExitString(stderr, 579*31197Sminshall "Unknown scancode encountered in AcceptKeystroke.\n", 1); 58030015Sminshall /*NOTREACHED*/ 58130015Sminshall } 582*31197Sminshall ctlrfcn = hits[scancode].hit[HITNUM(shiftstate)].ctlrfcn; 583*31197Sminshall c = hits[scancode].hit[HITNUM(shiftstate)].code; 58430015Sminshall 58530015Sminshall if (!UnLocked || HadAid) { 58630015Sminshall if (HadAid) { 58730015Sminshall SendToIBM(); 58830015Sminshall if (!EmptyChar()) { 589*31197Sminshall return 0; /* nothing to do */ 59030015Sminshall } 59130015Sminshall } 59230327Sminshall #if !defined(PURE3274) 59330015Sminshall if (!HadAid && EmptyChar()) { 59430076Sminshall if ((ctlrfcn == FCN_RESET) || (ctlrfcn == FCN_MASTER_RESET)) { 59530015Sminshall UnLocked = 1; 59630015Sminshall } 59730015Sminshall } 59830327Sminshall #endif /* !defined(PURE3274) */ 59930015Sminshall if (!UnLocked) { 600*31197Sminshall return 0; 60130015Sminshall } 60230015Sminshall } 60330015Sminshall /* now, either empty, or haven't seen aid yet */ 60430015Sminshall 60530015Sminshall 60630076Sminshall #if !defined(PURE3274) 60730015Sminshall if (TransparentClock == OutputClock) { 608*31197Sminshall if (ctlrfcn == FCN_AID) { 609*31197Sminshall UnLocked = 0; 610*31197Sminshall InsertMode = 0; 611*31197Sminshall AidByte = (c); 612*31197Sminshall HadAid = 1; 613*31197Sminshall } else { 614*31197Sminshall switch (ctlrfcn) { 615*31197Sminshall case FCN_ESCAPE: 616*31197Sminshall StopScreen(1); 617*31197Sminshall command(0); 618*31197Sminshall ConnectScreen(); 619*31197Sminshall break; 62030015Sminshall 621*31197Sminshall case FCN_RESET: 622*31197Sminshall case FCN_MASTER_RESET: 623*31197Sminshall UnLocked = 1; 624*31197Sminshall break; 62530015Sminshall 626*31197Sminshall default: 627*31197Sminshall return 0; 62830015Sminshall } 62930015Sminshall } 63030015Sminshall } 63130076Sminshall #endif /* !defined(PURE3274) */ 63230015Sminshall 633*31197Sminshall if (ctlrfcn == FCN_CHARACTER) { 634*31197Sminshall /* Add the character to the buffer */ 635*31197Sminshall OneCharacter(c, InsertMode); 636*31197Sminshall } else if (ctlrfcn == FCN_AID) { /* got Aid */ 637*31197Sminshall if (c == AID_CLEAR) { 638*31197Sminshall LocalClearScreen(); /* Side effect is to clear 3270 */ 63930015Sminshall } 640*31197Sminshall ResetOiaOnlineA(&OperatorInformationArea); 641*31197Sminshall SetOiaTWait(&OperatorInformationArea); 642*31197Sminshall ResetOiaInsert(&OperatorInformationArea); 643*31197Sminshall InsertMode = 0; /* just like a 3278 */ 644*31197Sminshall SetOiaSystemLocked(&OperatorInformationArea); 645*31197Sminshall SetOiaModified(); 646*31197Sminshall UnLocked = 0; 647*31197Sminshall AidByte = c; 648*31197Sminshall HadAid = 1; 649*31197Sminshall SendToIBM(); 650*31197Sminshall } else { 651*31197Sminshall switch (ctlrfcn) { 65230015Sminshall 653*31197Sminshall case FCN_CURSEL: 654*31197Sminshall c = FieldAttributes(CursorAddress)&ATTR_DSPD_MASK; 655*31197Sminshall if (!FormattedScreen() 656*31197Sminshall || ((c != ATTR_DSPD_DSPD) && (c != ATTR_DSPD_HIGH))) { 657*31197Sminshall RingBell("Cursor not in selectable field"); 658*31197Sminshall } else { 659*31197Sminshall i = ScreenInc(WhereAttrByte(CursorAddress)); 660*31197Sminshall c = GetHost(i); 661*31197Sminshall if (c == DISP_QUESTION) { 662*31197Sminshall AddHost(i, DISP_GREATER_THAN); 663*31197Sminshall TurnOnMdt(i); 664*31197Sminshall } else if (c == DISP_GREATER_THAN) { 665*31197Sminshall AddHost(i, DISP_QUESTION); 666*31197Sminshall TurnOffMdt(i); 667*31197Sminshall } else if (c == DISP_BLANK || c == DISP_NULL 668*31197Sminshall || c == DISP_AMPERSAND) { 669*31197Sminshall UnLocked = 0; 670*31197Sminshall InsertMode = 0; 671*31197Sminshall ResetOiaOnlineA(&OperatorInformationArea); 672*31197Sminshall SetOiaTWait(&OperatorInformationArea); 673*31197Sminshall SetOiaSystemLocked(&OperatorInformationArea); 674*31197Sminshall ResetOiaInsert(&OperatorInformationArea); 675*31197Sminshall SetOiaModified(); 676*31197Sminshall if (c == DISP_AMPERSAND) { 677*31197Sminshall TurnOnMdt(i); /* Only for & type */ 678*31197Sminshall AidByte = AID_ENTER; 67930015Sminshall } else { 680*31197Sminshall AidByte = AID_SELPEN; 68130015Sminshall } 682*31197Sminshall HadAid = 1; 683*31197Sminshall SendToIBM(); 684*31197Sminshall } else { 685*31197Sminshall RingBell( 686*31197Sminshall "Cursor not in a selectable field (designator)"); 68730015Sminshall } 688*31197Sminshall } 689*31197Sminshall break; 69030015Sminshall 69130327Sminshall #if !defined(PURE3274) 692*31197Sminshall case FCN_ERASE: 693*31197Sminshall if (IsProtected(ScreenDec(CursorAddress))) { 694*31197Sminshall RingBell("Protected Field"); 695*31197Sminshall } else { 696*31197Sminshall CursorAddress = ScreenDec(CursorAddress); 697*31197Sminshall Delete(CursorAddress, ScreenInc(CursorAddress)); 698*31197Sminshall } 699*31197Sminshall break; 700*31197Sminshall case FCN_WERASE: 701*31197Sminshall j = CursorAddress; 702*31197Sminshall i = ScreenDec(j); 703*31197Sminshall if (IsProtected(i)) { 704*31197Sminshall RingBell("Protected Field"); 705*31197Sminshall } else { 706*31197Sminshall SetXIsProtected(); 707*31197Sminshall while ((!XIsProtected(i) && Disspace(GetHost(i))) 708*31197Sminshall && (i != j)) { 709*31197Sminshall i = ScreenDec(i); 71030015Sminshall } 711*31197Sminshall /* we are pointing at a character in a word, or 712*31197Sminshall * at a protected position 713*31197Sminshall */ 714*31197Sminshall while ((!XIsProtected(i) && !Disspace(GetHost(i))) 715*31197Sminshall && (i != j)) { 716*31197Sminshall i = ScreenDec(i); 71730015Sminshall } 718*31197Sminshall /* we are pointing at a space, or at a protected 719*31197Sminshall * position 720*31197Sminshall */ 721*31197Sminshall CursorAddress = ScreenInc(i); 722*31197Sminshall Delete(CursorAddress, j); 723*31197Sminshall } 724*31197Sminshall break; 72530015Sminshall 726*31197Sminshall case FCN_FERASE: 727*31197Sminshall if (IsProtected(CursorAddress)) { 728*31197Sminshall RingBell("Protected Field"); 729*31197Sminshall } else { 730*31197Sminshall CursorAddress = ScreenInc(CursorAddress); /* for btab */ 731*31197Sminshall BackTab(); 732*31197Sminshall EraseEndOfField(); 733*31197Sminshall } 734*31197Sminshall break; 73530015Sminshall 736*31197Sminshall case FCN_RESET: 737*31197Sminshall if (InsertMode) { 738*31197Sminshall InsertMode = 0; 739*31197Sminshall ResetOiaInsert(&OperatorInformationArea); 740*31197Sminshall SetOiaModified(); 741*31197Sminshall } 742*31197Sminshall break; 743*31197Sminshall case FCN_MASTER_RESET: 744*31197Sminshall if (InsertMode) { 745*31197Sminshall InsertMode = 0; 746*31197Sminshall ResetOiaInsert(&OperatorInformationArea); 747*31197Sminshall SetOiaModified(); 748*31197Sminshall } 749*31197Sminshall RefreshScreen(); 750*31197Sminshall break; 75130327Sminshall #endif /* !defined(PURE3274) */ 75230015Sminshall 753*31197Sminshall case FCN_UP: 754*31197Sminshall CursorAddress = ScreenUp(CursorAddress); 755*31197Sminshall break; 75630015Sminshall 757*31197Sminshall case FCN_LEFT: 758*31197Sminshall CursorAddress = ScreenDec(CursorAddress); 759*31197Sminshall break; 76030015Sminshall 761*31197Sminshall case FCN_RIGHT: 762*31197Sminshall CursorAddress = ScreenInc(CursorAddress); 763*31197Sminshall break; 76430015Sminshall 765*31197Sminshall case FCN_DOWN: 766*31197Sminshall CursorAddress = ScreenDown(CursorAddress); 767*31197Sminshall break; 76830015Sminshall 769*31197Sminshall case FCN_DELETE: 770*31197Sminshall if (IsProtected(CursorAddress)) { 771*31197Sminshall RingBell("Protected Field"); 772*31197Sminshall } else { 773*31197Sminshall Delete(CursorAddress, ScreenInc(CursorAddress)); 774*31197Sminshall } 775*31197Sminshall break; 776*31197Sminshall 777*31197Sminshall case FCN_INSRT: 778*31197Sminshall InsertMode = !InsertMode; 779*31197Sminshall if (InsertMode) { 780*31197Sminshall SetOiaInsert(&OperatorInformationArea); 781*31197Sminshall } else { 782*31197Sminshall ResetOiaInsert(&OperatorInformationArea); 783*31197Sminshall } 784*31197Sminshall SetOiaModified(); 785*31197Sminshall break; 786*31197Sminshall 787*31197Sminshall case FCN_HOME: 788*31197Sminshall Home(); 789*31197Sminshall break; 790*31197Sminshall 791*31197Sminshall case FCN_NL: 792*31197Sminshall /* The algorithm is to look for the first unprotected 793*31197Sminshall * column after column 0 of the following line. Having 794*31197Sminshall * found that unprotected column, we check whether the 795*31197Sminshall * cursor-address-at-entry is at or to the right of the 796*31197Sminshall * LeftMargin AND the LeftMargin column of the found line 797*31197Sminshall * is unprotected. If this conjunction is true, then 798*31197Sminshall * we set the found pointer to the address of the LeftMargin 799*31197Sminshall * column in the found line. 800*31197Sminshall * Then, we set the cursor address to the found address. 801*31197Sminshall */ 802*31197Sminshall i = SetBufferAddress(ScreenLine(ScreenDown(CursorAddress)), 0); 803*31197Sminshall j = ScreenInc(WhereAttrByte(CursorAddress)); 804*31197Sminshall do { 805*31197Sminshall if (IsUnProtected(i)) { 806*31197Sminshall break; 80730015Sminshall } 808*31197Sminshall /* Again (see comment in Home()), this COULD be a problem 809*31197Sminshall * with an unformatted screen. 810*31197Sminshall */ 811*31197Sminshall /* If there was a field with only an attribute byte, 812*31197Sminshall * we may be pointing to the attribute byte of the NEXT 813*31197Sminshall * field, so just look at the next byte. 814*31197Sminshall */ 815*31197Sminshall if (IsStartField(i)) { 816*31197Sminshall i = ScreenInc(i); 81731192Sminshall } else { 818*31197Sminshall i = ScreenInc(FieldInc(i)); 81931192Sminshall } 820*31197Sminshall } while (i != j); 821*31197Sminshall if (!IsUnProtected(i)) { /* couldn't find unprotected */ 822*31197Sminshall i = SetBufferAddress(0,0); 823*31197Sminshall } 824*31197Sminshall if (OptLeftMargin <= ScreenLineOffset(CursorAddress)) { 825*31197Sminshall if (IsUnProtected(SetBufferAddress(ScreenLine(i), 826*31197Sminshall OptLeftMargin))) { 827*31197Sminshall i = SetBufferAddress(ScreenLine(i), OptLeftMargin); 828*31197Sminshall } 829*31197Sminshall } 830*31197Sminshall CursorAddress = i; 831*31197Sminshall break; 83230015Sminshall 833*31197Sminshall case FCN_EINP: 834*31197Sminshall if (!FormattedScreen()) { 835*31197Sminshall i = CursorAddress; 836*31197Sminshall TurnOffMdt(i); 83730015Sminshall do { 838*31197Sminshall AddHost(i, 0); 839*31197Sminshall i = ScreenInc(i); 840*31197Sminshall } while (i != CursorAddress); 841*31197Sminshall } else { 842*31197Sminshall /* 843*31197Sminshall * The algorithm is: go through each unprotected 844*31197Sminshall * field on the screen, clearing it out. When 845*31197Sminshall * we are at the start of a field, skip that field 846*31197Sminshall * if its contents are protected. 84730015Sminshall */ 848*31197Sminshall i = j = FieldInc(CursorAddress); 849*31197Sminshall do { 850*31197Sminshall if (IsUnProtected(ScreenInc(i))) { 85130015Sminshall i = ScreenInc(i); 852*31197Sminshall TurnOffMdt(i); 853*31197Sminshall do { 854*31197Sminshall AddHost(i, 0); 855*31197Sminshall i = ScreenInc(i); 856*31197Sminshall } while (!IsStartField(i)); 85730015Sminshall } else { 858*31197Sminshall i = FieldInc(i); 85930015Sminshall } 86030015Sminshall } while (i != j); 861*31197Sminshall } 862*31197Sminshall Home(); 863*31197Sminshall break; 86430015Sminshall 865*31197Sminshall case FCN_EEOF: 866*31197Sminshall EraseEndOfField(); 867*31197Sminshall break; 86830015Sminshall 869*31197Sminshall case FCN_SPACE: 870*31197Sminshall OneCharacter(DISP_BLANK, InsertMode); /* Add cent */ 871*31197Sminshall break; 87230015Sminshall 873*31197Sminshall case FCN_CENTSIGN: 874*31197Sminshall OneCharacter(DISP_CENTSIGN, InsertMode); /* Add cent */ 875*31197Sminshall break; 87630015Sminshall 877*31197Sminshall case FCN_FM: 878*31197Sminshall OneCharacter(DISP_FM, InsertMode); /* Add field mark */ 879*31197Sminshall break; 88030015Sminshall 881*31197Sminshall case FCN_DP: 882*31197Sminshall if (IsProtected(CursorAddress)) { 883*31197Sminshall RingBell("Protected Field"); 884*31197Sminshall } else { 885*31197Sminshall OneCharacter(DISP_DUP, InsertMode);/* Add dup character */ 886*31197Sminshall Tab(); 887*31197Sminshall } 888*31197Sminshall break; 88930015Sminshall 890*31197Sminshall case FCN_TAB: 891*31197Sminshall Tab(); 892*31197Sminshall break; 89330015Sminshall 894*31197Sminshall case FCN_BTAB: 895*31197Sminshall BackTab(); 896*31197Sminshall break; 89730015Sminshall 89830015Sminshall #ifdef NOTUSED /* Actually, this is superseded by unix flow 899*31197Sminshall * control. 900*31197Sminshall */ 901*31197Sminshall case FCN_XOFF: 902*31197Sminshall Flow = 0; /* stop output */ 903*31197Sminshall break; 90430015Sminshall 905*31197Sminshall case FCN_XON: 906*31197Sminshall if (!Flow) { 907*31197Sminshall Flow = 1; /* turn it back on */ 908*31197Sminshall DoTerminalOutput(); 909*31197Sminshall } 910*31197Sminshall break; 91130015Sminshall #endif /* NOTUSED */ 91230015Sminshall 91330327Sminshall #if !defined(PURE3274) 914*31197Sminshall case FCN_ESCAPE: 915*31197Sminshall /* FlushChar(); do we want to flush characters from before? */ 916*31197Sminshall StopScreen(1); 917*31197Sminshall command(0); 918*31197Sminshall ConnectScreen(); 919*31197Sminshall break; 92030015Sminshall 921*31197Sminshall case FCN_DISC: 922*31197Sminshall StopScreen(1); 923*31197Sminshall suspend(); 924*31197Sminshall setconnmode(); 925*31197Sminshall ConnectScreen(); 926*31197Sminshall break; 92730015Sminshall 928*31197Sminshall case FCN_RESHOW: 929*31197Sminshall RefreshScreen(); 930*31197Sminshall break; 93130015Sminshall 932*31197Sminshall case FCN_SETTAB: 933*31197Sminshall OptColTabs[ScreenLineOffset(CursorAddress)] = 1; 934*31197Sminshall break; 93530015Sminshall 936*31197Sminshall case FCN_DELTAB: 937*31197Sminshall OptColTabs[ScreenLineOffset(CursorAddress)] = 0; 938*31197Sminshall break; 93930015Sminshall 940*31197Sminshall /* 941*31197Sminshall * Clear all tabs, home line, and left margin. 942*31197Sminshall */ 943*31197Sminshall case FCN_CLRTAB: 944*31197Sminshall for (i = 0; i < sizeof OptColTabs; i++) { 945*31197Sminshall OptColTabs[i] = 0; 946*31197Sminshall } 947*31197Sminshall OptHome = 0; 948*31197Sminshall OptLeftMargin = 0; 949*31197Sminshall break; 95030015Sminshall 951*31197Sminshall case FCN_COLTAB: 952*31197Sminshall ColTab(); 953*31197Sminshall break; 95430015Sminshall 955*31197Sminshall case FCN_COLBAK: 956*31197Sminshall ColBak(); 957*31197Sminshall break; 95830015Sminshall 959*31197Sminshall case FCN_INDENT: 960*31197Sminshall ColTab(); 961*31197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 962*31197Sminshall break; 96330015Sminshall 964*31197Sminshall case FCN_UNDENT: 965*31197Sminshall ColBak(); 966*31197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 967*31197Sminshall break; 96830015Sminshall 969*31197Sminshall case FCN_SETMRG: 970*31197Sminshall OptLeftMargin = ScreenLineOffset(CursorAddress); 971*31197Sminshall break; 97230015Sminshall 973*31197Sminshall case FCN_SETHOM: 974*31197Sminshall OptHome = ScreenLine(CursorAddress); 975*31197Sminshall break; 97630015Sminshall 977*31197Sminshall /* 978*31197Sminshall * Point to first character of next unprotected word on 979*31197Sminshall * screen. 980*31197Sminshall */ 981*31197Sminshall case FCN_WORDTAB: 982*31197Sminshall i = CursorAddress; 983*31197Sminshall SetXIsProtected(); 984*31197Sminshall while (!XIsProtected(i) && !Disspace(GetHost(i))) { 985*31197Sminshall i = ScreenInc(i); 986*31197Sminshall if (i == CursorAddress) { 987*31197Sminshall break; 98830015Sminshall } 989*31197Sminshall } 990*31197Sminshall /* i is either protected, a space (blank or null), 991*31197Sminshall * or wrapped 992*31197Sminshall */ 993*31197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 994*31197Sminshall i = ScreenInc(i); 995*31197Sminshall if (i == CursorAddress) { 996*31197Sminshall break; 99730015Sminshall } 998*31197Sminshall } 999*31197Sminshall CursorAddress = i; 1000*31197Sminshall break; 100130015Sminshall 1002*31197Sminshall case FCN_WORDBACKTAB: 1003*31197Sminshall i = ScreenDec(CursorAddress); 1004*31197Sminshall SetXIsProtected(); 1005*31197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 1006*31197Sminshall i = ScreenDec(i); 1007*31197Sminshall if (i == CursorAddress) { 1008*31197Sminshall break; 100930015Sminshall } 1010*31197Sminshall } 1011*31197Sminshall /* i is pointing to a character IN an unprotected word 1012*31197Sminshall * (or i wrapped) 1013*31197Sminshall */ 1014*31197Sminshall while (!Disspace(GetHost(i))) { 1015*31197Sminshall i = ScreenDec(i); 1016*31197Sminshall if (i == CursorAddress) { 1017*31197Sminshall break; 101830015Sminshall } 1019*31197Sminshall } 1020*31197Sminshall CursorAddress = ScreenInc(i); 1021*31197Sminshall break; 102230015Sminshall 1023*31197Sminshall /* Point to last non-blank character of this/next 1024*31197Sminshall * unprotected word. 1025*31197Sminshall */ 1026*31197Sminshall case FCN_WORDEND: 1027*31197Sminshall i = ScreenInc(CursorAddress); 1028*31197Sminshall SetXIsProtected(); 1029*31197Sminshall while (XIsProtected(i) || Disspace(GetHost(i))) { 1030*31197Sminshall i = ScreenInc(i); 1031*31197Sminshall if (i == CursorAddress) { 1032*31197Sminshall break; 103330015Sminshall } 1034*31197Sminshall } 1035*31197Sminshall /* we are pointing at a character IN an 1036*31197Sminshall * unprotected word (or we wrapped) 1037*31197Sminshall */ 1038*31197Sminshall while (!Disspace(GetHost(i))) { 1039*31197Sminshall i = ScreenInc(i); 1040*31197Sminshall if (i == CursorAddress) { 1041*31197Sminshall break; 104230015Sminshall } 1043*31197Sminshall } 1044*31197Sminshall CursorAddress = ScreenDec(i); 1045*31197Sminshall break; 104630015Sminshall 1047*31197Sminshall /* Get to last non-blank of this/next unprotected 1048*31197Sminshall * field. 1049*31197Sminshall */ 1050*31197Sminshall case FCN_FIELDEND: 1051*31197Sminshall i = LastOfField(CursorAddress); 1052*31197Sminshall if (i != CursorAddress) { 1053*31197Sminshall CursorAddress = i; /* We moved; take this */ 1054*31197Sminshall } else { 1055*31197Sminshall j = FieldInc(CursorAddress); /* Move to next field */ 1056*31197Sminshall i = LastOfField(j); 1057*31197Sminshall if (i != j) { 1058*31197Sminshall CursorAddress = i; /* We moved; take this */ 105930015Sminshall } 1060*31197Sminshall /* else - nowhere else on screen to be; stay here */ 1061*31197Sminshall } 1062*31197Sminshall break; 106330327Sminshall #endif /* !defined(PURE3274) */ 106430015Sminshall 1065*31197Sminshall default: 1066*31197Sminshall /* We don't handle this yet */ 1067*31197Sminshall RingBell("Function not implemented"); 1068*31197Sminshall } 1069*31197Sminshall } 1070*31197Sminshall return 1; /* We did something! */ 1071*31197Sminshall } 1072*31197Sminshall 1073*31197Sminshall 1074*31197Sminshall /* 1075*31197Sminshall * We get data from the terminal. We keep track of the shift state 1076*31197Sminshall * (including ALT, CONTROL), and then call AcceptKeystroke to actually 1077*31197Sminshall * process any non-shift keys. 1078*31197Sminshall */ 1079*31197Sminshall 1080*31197Sminshall int 1081*31197Sminshall DataFrom3270(buffer, count) 1082*31197Sminshall unsigned char *buffer; /* where the data is */ 1083*31197Sminshall int count; /* how much data there is */ 1084*31197Sminshall { 1085*31197Sminshall int origCount; 1086*31197Sminshall 1087*31197Sminshall origCount = count; 1088*31197Sminshall 1089*31197Sminshall while (count) { 1090*31197Sminshall if (*buffer >= numberof(hits)) { 1091*31197Sminshall ExitString(stderr, 1092*31197Sminshall "Unknown scancode encountered in DataFrom3270.\n", 1); 1093*31197Sminshall /*NOTREACHED*/ 1094*31197Sminshall } 1095*31197Sminshall 1096*31197Sminshall switch (hits[*buffer].hit[HITNUM(rememberedshiftstate)].ctlrfcn) { 1097*31197Sminshall 1098*31197Sminshall case FCN_MAKE_SHIFT: 1099*31197Sminshall rememberedshiftstate |= (SHIFT_RIGHT|SHIFT_UPSHIFT); 1100*31197Sminshall break; 1101*31197Sminshall case FCN_BREAK_SHIFT: 1102*31197Sminshall rememberedshiftstate &= ~(SHIFT_RIGHT|SHIFT_UPSHIFT); 1103*31197Sminshall break; 1104*31197Sminshall case FCN_MAKE_ALT: 1105*31197Sminshall rememberedshiftstate |= SHIFT_ALT; 1106*31197Sminshall break; 1107*31197Sminshall case FCN_BREAK_ALT: 1108*31197Sminshall rememberedshiftstate &= ~SHIFT_ALT; 1109*31197Sminshall break; 1110*31197Sminshall default: 1111*31197Sminshall if (AcceptKeystroke(*buffer, rememberedshiftstate) == 0) { 1112*31197Sminshall return(origCount-count); 111330015Sminshall } 1114*31197Sminshall break; 111530015Sminshall } 1116*31197Sminshall buffer++; 1117*31197Sminshall count--; 111830015Sminshall } 111930015Sminshall return(origCount-count); 112030015Sminshall } 1121