/*************************************** * CONSOLE INPUT v1.23 * © Copyright 1988 Timm Martin * All Rights Reserved ****************************************/ #include #include #include #include int console_input( header ) struct ConsoleHeader *header; { ULONG actual; /* actual number of characters read from console */ UBYTE hold; /* temporary character storage */ int where; /* character in buffer being examined */ actual = con_read( header->ReadReq, header->Buffer ); if (!actual) return (0); /* no characters read */ else where = 0; /* start at beginning of buffer */ /* if read printable character */ if ((header->Buffer[where] >= 0x20 && header->Buffer[where] <= 0x7E) || (header->Buffer[where] >= 0xA0 && header->Buffer[where] <= 0xFF)) /* if input is masked */ if (header->Mask) { /* if acceptable input character */ if ((header->Mask->Element[header->Buffer[where]>>5]) & (MASK_ENABLE << (header->Buffer[where] % 32 ))) return (header->Buffer[where]); else return (0); } else return (header->Buffer[where]); else if (header->Buffer[where] == BACKSPACE_CODE) return (CON_BACKSPACE); else if (header->Buffer[where] == RETURN_CODE) return (CON_RETURN); else if (header->Buffer[where] == DELETE_CODE) return (CON_DELETE); else if (header->Buffer[where] == TAB_CODE) return (CON_TAB); else if (header->Buffer[where] == ESCAPE_CODE) return (CON_ESCAPE); else if ((hold = header->Buffer[where] | CONTROL_CODE) >= ' ' && hold <= '~') return (CON_CONTROL + hold); /* return control key */ else if (header->Buffer[where] == CSI) { if (actual == 1) return (CON_ALT_ESCAPE); if (header->Buffer[++where] >= '0' && header->Buffer[where] <= '9') { if (header->Buffer[where+1] == '~') /* function keys F1-F10 */ return (CON_F + header->Buffer[where] - '0' + 1); else if (header->Buffer[where+1] >= '0' && header->Buffer[where+1] <= '9' && header->Buffer[where+2] == '~') /* shifted F1-F10 */ return (CON_SHIFT_F + header->Buffer[where+1] - '0' + 1); } /* if receiving function key input */ else { switch (header->Buffer[where]) { case 'A': return (CON_CURSOR_UP); break; case 'B': return (CON_CURSOR_DOWN); break; case 'C': return (CON_CURSOR_RIGHT); break; case 'D': return (CON_CURSOR_LEFT); break; case ' ': if (header->Buffer[++where] == '@') return (CON_SHIFT_RIGHT); else if (header->Buffer[where] == 'A') return (CON_SHIFT_LEFT); break; case 'T': return (CON_SHIFT_UP); break; case 'S': return (CON_SHIFT_DOWN); break; case '?': if (header->Buffer[++where] == '~') return (CON_HELP); break; case 'Z': return (CON_SHIFT_TAB); break; } /* switch */ } /* else not function keys */ } /* else header->Buffer == */ return (0); /* unrecognizable character */ }