diff options
Diffstat (limited to 'ncurses-5.3/tack/scan.c')
-rw-r--r-- | ncurses-5.3/tack/scan.c | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/ncurses-5.3/tack/scan.c b/ncurses-5.3/tack/scan.c deleted file mode 100644 index 83b884f..0000000 --- a/ncurses-5.3/tack/scan.c +++ /dev/null @@ -1,261 +0,0 @@ -/* -** Copyright (C) 1991, 1997 Free Software Foundation, Inc. -** -** This file is part of TACK. -** -** TACK is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2, or (at your option) -** any later version. -** -** TACK is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with TACK; see the file COPYING. If not, write to -** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -** Boston, MA 02111-1307, USA. -*/ -/* scan mode keyboard support */ - -#include <tack.h> - -MODULE_ID("$Id$") - -int scan_max; /* length of longest scan code */ -char **scan_up, **scan_down, **scan_name; -int *scan_tested, *scan_length, *scan_value; - -static int shift_state; -static char *str; -static int debug_char_count; - -#define SHIFT_KEY 0x100 -#define CONTROL_KEY 0x200 -#define META_KEY 0x400 -#define CAPS_LOCK 0x800 - -static const struct { - const char *name; - int type; -} scan_special[] = { - {"<shift>", SHIFT_KEY}, - {"<left shift>", SHIFT_KEY}, - {"<right shift>", SHIFT_KEY}, - {"<control>", CONTROL_KEY}, - {"<left control>", CONTROL_KEY}, - {"<right control>", CONTROL_KEY}, - {"<meta>", META_KEY}, - {"<left meta>", META_KEY}, - {"<right meta>", META_KEY}, - {"<caps lock>", CAPS_LOCK}, - {"<tab>", '\t'}, - {"<space>", ' '}, - {"<return>", '\r'}, - {"<linefeed>", '\n'}, - {"<formfeed>", '\f'}, - {"<backspace>", '\b'}, - {0, 0} -}; - -static void -scan_blanks(void) -{ /* scan past the white space */ - while (*str == ' ' || *str == '\t') - str++; -} - -static char * -smash(void) -{ /* convert a string to hex */ - char *s, *t; - int ch, i, j; - - t = s = str; - for (i = 0; (ch = *str); str++) { - if (ch >= '0' && ch <= '9') - j = ch - '0'; - else if (ch >= 'a' && ch <= 'f') - j = 10 - 'a' + ch; - else if (ch >= 'A' && ch <= 'F') - j = 10 - 'A' + ch; - else if (ch == ' ' || ch == '\t') - break; - else - continue; - if (i) { - *s |= j; - s++; - } else - *s = j << 4; - i ^= 1; - } - *s = '\0'; - return t; -} - -void -scan_init(char *fn) -{ /* read the scan mode key definitions */ - char *s, *sl; - FILE *fp; - int ch, i, j; - char home[512]; - - if ((str = getenv("HOME"))) - strcpy(home, str); - else - home[0] = '\0'; - fp = NULL; - if ((str = getenv("KEYBOARD"))) { - if (!(fp = fopen(str, "r")) && home[0]) { - sprintf(temp, "%s/.scan.%s", home, str); - fp = fopen(temp, "r"); - } - } - if (!fp) { - sprintf(temp, ".scan.%s", fn); - fp = fopen(temp, "r"); - } - if (!fp && home[0]) { - sprintf(temp, "%s/.scan.%s", home, fn); - fp = fopen(temp, "r"); - } - if (!fp) { - ptext("Unable to open scanfile: "); - ptextln(temp); - bye_kids(1); - return; - } - /* - scan file format: - - <down value> <up value> <name> - - values are in hex. <name> may be any string of characters - - */ - scan_up = (char **) malloc(sizeof(char *) * MAX_SCAN); - scan_down = (char **) malloc(sizeof(char *) * MAX_SCAN); - scan_name = (char **) malloc(sizeof(char *) * MAX_SCAN); - scan_tested = (int *) malloc(sizeof(int *) * MAX_SCAN); - scan_length = (int *) malloc(sizeof(int *) * MAX_SCAN); - scan_value = (int *) malloc(sizeof(int *) * MAX_SCAN); - scan_up[0] = scan_down[0] = scan_name[0] = (char *) 0; - str = (char *) malloc(4096); /* buffer space */ - sl = str + 4000; /* an upper limit */ - scan_max = 1; - for (i = 0;;) { - for (s = str; (ch = getc(fp)) != EOF;) { - if (ch == '\n' || ch == '\r') - break; - *s++ = ch; - } - *s++ = '\0'; - if (ch == EOF) - break; - if (*str == '#' || *str == '\0') - continue; - scan_down[i] = smash(); - scan_blanks(); - scan_up[i] = smash(); - scan_blanks(); - scan_name[i] = str; - - scan_length[i] = strlen(scan_down[i]); - ch = strlen(scan_up[i]) + scan_length[i]; - if (ch > scan_max) - scan_max = ch; - - scan_value[i] = scan_name[i][0]; - if (scan_name[i][1]) /* multi-character name */ - for (j = 0; scan_special[j].name; j++) { - if (!strcmp(scan_name[i], scan_special[j].name)) { - scan_value[i] = scan_special[j].type; - break; - } - } - - i++; - if (str > sl) { - str = (char *) malloc(4096); - sl = str + 4000; - } else - str = s; - } - fclose(fp); -#ifdef notdef - for (i = 0; scan_down[i]; i++) { - put_str(hex_expand_to(scan_down[i], 3)); - put_str(hex_expand_to(scan_up[i], 3)); - put_str(" "); - put_str(scan_name[i]); - put_crlf(); - } - (void) wait_here(); -#endif -} - -int -scan_key(void) -{ /* read a key and translate scan mode to - ASCII */ - int i, j, ch; - char buf[64]; - - for (i = 1;; i++) { - ch = getchar(); - if (ch == EOF) - return EOF; - if (debug_fp) { - fprintf(debug_fp, "%02X ", ch); - debug_char_count += 3; - if (debug_char_count > 72) { - fprintf(debug_fp, "\n"); - debug_char_count = 0; - } - } - buf[i - 1] = ch; - buf[i] = '\0'; - if (buf[0] & 0x80) { /* scan up */ - for (j = 0; scan_up[j]; j++) { - if (i == scan_length[j] && - !strcmp(buf, scan_up[j])) { - i = 0; - shift_state &= ~scan_value[j]; - break; - } - } - continue; - } - for (j = 0; scan_down[j]; j++) { - if (i == scan_length[j] && !strcmp(buf, scan_down[j])) { - i = 0; - shift_state |= scan_value[j]; - ch = scan_value[j]; - if (ch == CAPS_LOCK) - shift_state ^= SHIFT_KEY; - if (ch >= 256) - break; - if (shift_state & SHIFT_KEY) { - if (ch >= 0x60) - ch -= 0x20; - else if (ch >= 0x30 && ch <= 0x3f) - ch -= 0x10; - } - if (shift_state & CONTROL_KEY) { - if ((ch | 0x20) >= 0x60 && - (ch | 0x20) <= 0x7f) - ch = (ch | 0x20) - 0x60; - } - if (shift_state & META_KEY) - ch |= 0x80; - return ch; - } - } - if (i > scan_max) - i = 1; - } -} |