diff options
Diffstat (limited to 'mdk-stage1/slang/slkeymap.c')
| -rw-r--r-- | mdk-stage1/slang/slkeymap.c | 596 | 
1 files changed, 0 insertions, 596 deletions
| diff --git a/mdk-stage1/slang/slkeymap.c b/mdk-stage1/slang/slkeymap.c deleted file mode 100644 index dff65433e..000000000 --- a/mdk-stage1/slang/slkeymap.c +++ /dev/null @@ -1,596 +0,0 @@ -/* Keymap routines for SLang.  The role of these keymap routines is simple: - * Just read keys from the tty and return a pointer to a keymap structure. - * That is, a keymap is simple a mapping of strings (keys from tty) to - * structures.  Also included are routines for managing the keymaps. - */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* We need a define a rule for upperand lower case chars that user cannot -   change!  This could be a problem for international chars! */ - -#define UPPER_CASE_KEY(x) (((x) >= 'a') && ((x) <= 'z') ? (x) - 32 : (x)) -#define LOWER_CASE_KEY(x) (((x) >= 'A') && ((x) <= 'Z') ? (x) + 32 : (x)) - -int SLang_Key_TimeOut_Flag = 0;	       /* true if more than 1 sec has elapsed -                                          without key in multikey sequence */ - -int SLang_Last_Key_Char; - -SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS]; - -static SLang_Key_Type *malloc_key(unsigned char *str) -{ -   SLang_Key_Type *neew; - -   if (NULL == (neew = (SLang_Key_Type *) SLmalloc(sizeof(SLang_Key_Type)))) -     return NULL; - -   SLMEMSET ((char *) neew, 0, sizeof (SLang_Key_Type)); -   SLMEMCPY((char *) neew->str, (char *) str, (unsigned int) *str); -   return(neew); -} - -static SLKeyMap_List_Type *add_keymap (char *name, SLang_Key_Type *map) -{ -   int i; - -   for (i = 0; i < SLANG_MAX_KEYMAPS; i++) -     { -	if (SLKeyMap_List[i].keymap == NULL) -	  { -	     if (NULL == (name = SLang_create_slstring (name))) -	       return NULL; - -	     SLKeyMap_List[i].keymap = map; -	     SLKeyMap_List[i].name = name; -	     return &SLKeyMap_List[i]; -	  } -     } -   SLang_Error = SL_UNKNOWN_ERROR; -   /* SLang_doerror ("Keymap quota exceeded."); */ -   return NULL; -} - -FVOID_STAR SLang_find_key_function(char *name, SLKeyMap_List_Type *keymap) -{ -   SLKeymap_Function_Type *fp = keymap -> functions; -   char ch = *name; - -   while ((fp != NULL) && (fp->name != NULL)) -     { -	if ((ch == *fp->name) -	    && (0 == strcmp(fp->name, name))) -	  return (FVOID_STAR) fp->f; - -	fp++; -     } -   return NULL; -} - -#ifdef REAL_UNIX_SYSTEM -/* Expand termcap string specified by s.  s as passed will have the format: - *   "XY)..."  where XY represents a termcap keyname. - */ -static char *process_termcap_string (char *s, char *str, int *ip, int imax) -{ -   char c[3], *val; -   int i; - -   if ((0 == (c[0] = s[0])) -       || (0 == (c[1] = s[1])) -       || (s[2] != ')')) -     { -	SLang_verror (SL_SYNTAX_ERROR, "setkey: ^(%s is badly formed", s); -	return NULL; -     } -   s += 3; - -   c[2] = 0; -   if ((NULL == (val = SLtt_tgetstr (c))) -       || (*val == 0)) -     return NULL; - -   i = *ip; -   while ((i < imax) && (*val != 0)) -     { -	str[i++] = *val++; -     } -   *ip = i; - -   return s; -} -#endif - -/* convert things like "^A" to 1 etc... The 0th char is the strlen INCLUDING - * the length character itself. - */ -char *SLang_process_keystring(char *s) -{ -   /* FIXME: v2.0, make this thread safe */ -   static char str[32]; -   unsigned char ch; -   int i; - -   i = 1; -   while (*s != 0) -     { -	ch = (unsigned char) *s++; -	if (ch == '^') -	  { -	     ch = *s++; -	     if (ch == 0) -	       { -		  if (i < 32) -		    str[i++] = '^'; -		  break; -	       } -#ifdef REAL_UNIX_SYSTEM -	     if (ch == '(') -	       { -		  s = process_termcap_string (s, str, &i, 32); -		  if (s == NULL) -		    { -		       str[0] = 1; -		       return str; -		    } -		  continue; -	       } -#endif -	     ch = UPPER_CASE_KEY(ch); -	     if (ch == '?') ch = 127; else ch = ch - 'A' + 1; -	  } - -	if (i >= 32) break; -	str[i++] = ch; -     } - -   if (i > SLANG_MAX_KEYMAP_KEY_SEQ) -     { -	SLang_verror (SL_INVALID_PARM, "Key sequence is too long"); -	return NULL; -     } - -   str[0] = i; -   return(str); -} - -static int key_string_compare (unsigned char *a, unsigned char *b, unsigned int len) -{ -   unsigned char *amax = a + len; -   int cha, chb, cha_up, chb_up; - -   while (a < amax) -     { -	cha = *a++; -	chb = *b++; - -	if (cha == chb) continue; - -	cha_up = UPPER_CASE_KEY(cha); -	chb_up = UPPER_CASE_KEY(chb); - -	if (cha_up == chb_up) -	  { -	     /* Use case-sensitive result. */ -	     return cha - chb; -	  } -	/* Use case-insensitive result. */ -	return cha_up - chb_up; -     } -   return 0; -} - -static char *Define_Key_Error = "Inconsistency in define key."; - -/* This function also performs an insertion in an ordered way. */ -static int find_the_key (char *s, SLKeyMap_List_Type *kml, SLang_Key_Type **keyp) -{ -   unsigned char ch; -   unsigned int str_len; -   SLang_Key_Type *key, *last, *neew; -   unsigned char *str; - -   *keyp = NULL; - -   if (NULL == (str = (unsigned char *) SLang_process_keystring(s))) -     return -2; - -   if (1 == (str_len = str[0])) -     return 0; - -   ch = str[1]; -   key = kml->keymap + ch; - -   if (str_len == 2) -     { -	if (key->next != NULL) -	  { -	     SLang_doerror (Define_Key_Error); -	     return -2; -	  } - -	if (key->type == SLKEY_F_INTERPRET) -	  SLang_free_slstring (key->f.s); - -	key->str[0] = str_len; -	key->str[1] = ch; - -	*keyp = key; -	return 0; -     } - -   /* insert the key definition */ -   while (1) -     { -	int cmp; -	unsigned int key_len, len; - -	last = key; -	key = key->next; - -	if ((key != NULL) && (key->str != NULL)) -	  { -	     len = key_len = key->str[0]; -	     if (len > str_len) len = str_len; - -	     cmp = key_string_compare (str + 1, key->str + 1, len - 1); - -	     if (cmp > 0) -	       continue; - -	     if (cmp == 0) -	       { -		  if (key_len != str_len) -		    { -		       SLang_doerror (Define_Key_Error); -		       return -2; -		    } - -		  if (key->type == SLKEY_F_INTERPRET) -		    SLang_free_slstring (key->f.s); - -		  *keyp = key; -		  return 0; -	       } -	     /* Drop to cmp < 0 case */ -	  } - -	if (NULL == (neew = malloc_key(str))) return -1; - -	neew -> next = key; -	last -> next = neew; - -	*keyp = neew; -	return 0; -     } -} - -/* returns -2 if inconsistent, -1 if malloc error, 0 upon success */ -int SLkm_define_key (char *s, FVOID_STAR f, SLKeyMap_List_Type *kml) -{ -   SLang_Key_Type *key; -   unsigned int type = SLKEY_F_INTRINSIC; -   int ret; - -   ret = find_the_key (s, kml, &key); -   if ((ret != 0) || (key == NULL)) -     return ret; - -   key->type = type; -   key->f.f = f; -   return 0; -} - -int SLang_define_key (char *s, char *funct, SLKeyMap_List_Type *kml) -{ -   SLang_Key_Type *key; -   FVOID_STAR f; -   int ret; - -   ret = find_the_key (s, kml, &key); -   if ((ret != 0) || (key == NULL)) -     return ret; - -   f = SLang_find_key_function(funct, kml); - -   if (f == NULL)                      /* assume interpreted */ -     { -	char *str = SLang_create_slstring (funct); -	if (str == NULL) return -1; -	key->type = SLKEY_F_INTERPRET; -	key->f.s = str; -     } -   else -     { -	key->type = SLKEY_F_INTRINSIC; -	key->f.f = f; -     } -   return 0; -} - -int SLkm_define_keysym (char *s, unsigned int keysym, SLKeyMap_List_Type *kml) -{ -   SLang_Key_Type *key; -   int ret; - -   ret = find_the_key (s, kml, &key); - -   if ((ret != 0) || (key == NULL)) -     return ret; - -   key->type = SLKEY_F_KEYSYM; -   key->f.keysym = keysym; -   return 0; -} - -SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *kml, int (*getkey)(void)) -{ -   register SLang_Key_Type *key, *next, *kmax; -   unsigned int len; -   unsigned char input_ch; -   register unsigned char chup, chlow; -   unsigned char key_ch = 0; - -   SLang_Last_Key_Char = (*getkey)(); -   SLang_Key_TimeOut_Flag = 0; - -   if (SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char) -     return NULL; - -   input_ch = (unsigned char) SLang_Last_Key_Char; - -   key = (SLang_Key_Type *) &((kml->keymap)[input_ch]); - -   /* if the next one is null, then we know this MAY be it. */ -   while (key->next == NULL) -     { -	if (key->type != 0) -	  return key; - -	/* Try its opposite case counterpart */ -	chlow = LOWER_CASE_KEY(input_ch); -	if (input_ch == chlow) -	  input_ch = UPPER_CASE_KEY(input_ch); - -	key = kml->keymap + input_ch; -	if (key->type == 0) -	  return NULL; -     } - -   /* It appears to be a prefix character in a key sequence. */ - -   len = 1;			       /* already read one character */ -   key = key->next;		       /* Now we are in the key list */ -   kmax = NULL;			       /* set to end of list */ - -   while (1) -     { -	SLang_Key_TimeOut_Flag = 1; -	SLang_Last_Key_Char = (*getkey)(); -	SLang_Key_TimeOut_Flag = 0; - -	len++; - -	if ((SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char) -	    || SLKeyBoard_Quit) -	  break; - -	input_ch = (unsigned char) SLang_Last_Key_Char; - -	chup = UPPER_CASE_KEY(input_ch); chlow = LOWER_CASE_KEY(input_ch); - -	while (key != kmax) -	  { -	     if (key->str[0] > len) -	       { -		  key_ch = key->str[len]; -		  if (chup == UPPER_CASE_KEY(key_ch)) -		    break; -	       } -	     key = key->next; -	  } - -	if (key == kmax) break; - -	/* If the input character is lowercase, check to see if there is -	 * a lowercase match.  If so, set key to it.  Note: the -	 * algorithm assumes the sorting performed by key_string_compare. -	 */ -	if (input_ch != key_ch) -	  { -	     next = key->next; -	     while (next != kmax) -	       { -		  if (next->str[0] > len) -		    { -		       unsigned char next_ch = next->str[len]; -		       if (next_ch == input_ch) -			 { -			    key = next; -			    break; -			 } -		       if (next_ch != chup) -			 break; -		    } -		  next = next->next; -	       } -	  } - -	/* Ok, we found the first position of a possible match.  If it -	 * is exact, we are done. -	 */ -	if ((unsigned int) key->str[0] == len + 1) -	  return key; - -	/* Apparantly, there are some ambiguities. Read next key to resolve -	 * the ambiguity.  Adjust kmax to encompass ambiguities. -	 */ - -	next = key->next; -	while (next != kmax) -	  { -	     if ((unsigned int) next->str[0] > len) -	       { -		  key_ch = next->str[len]; -		  if (chup != UPPER_CASE_KEY(key_ch)) -		    break; -	       } -	     next = next->next; -	  } -	kmax = next; -     } - -   return NULL; -} - -void SLang_undefine_key(char *s, SLKeyMap_List_Type *kml) -{ -   int n, i; -   SLang_Key_Type *key, *next, *last, *key_root, *keymap; -   unsigned char *str; - -   keymap = kml -> keymap; -   if (NULL == (str = (unsigned char *) SLang_process_keystring(s))) -     return; - -   if (0 == (n = *str++ - 1)) return; -   i = *str; - -   last = key_root = (SLang_Key_Type *) &(keymap[i]); -   key = key_root->next; - -   while (key != NULL) -     { -	next = key->next; -	if (0 == SLMEMCMP ((char *)(key->str + 1), (char *) str, n)) -	  { -	     if (key->type == SLKEY_F_INTERPRET) -	       SLang_free_slstring (key->f.s); - -	     SLfree((char *) key); -	     last->next = next; -	  } -	else last = key; -	key = next; -     } - -   if (n == 1) -     { -	*key_root->str = 0; -	key_root->f.f = NULL; -	key_root->type = 0; -     } -} - -char *SLang_make_keystring(unsigned char *s) -{ -   static char buf [3 * SLANG_MAX_KEYMAP_KEY_SEQ + 1]; -   char *b; -   int n; - -   n = *s++ - 1; - -   if (n > SLANG_MAX_KEYMAP_KEY_SEQ) -     { -	SLang_verror (SL_INVALID_PARM, "Key sequence is too long"); -	return NULL; -     } - -   b = buf; -   while (n--) -     { -	if (*s < 32) -	  { -	     *b++ = '^'; -	     *b++ = *s + 'A' - 1; -	  } -	else *b++ = *s; -	s++; -     } -   *b = 0; -   return(buf); -} - -static SLang_Key_Type *copy_keymap(SLKeyMap_List_Type *kml) -{ -   int i; -   SLang_Key_Type *neew, *old, *new_root, *km; - -   if (NULL == (new_root = (SLang_Key_Type *) SLcalloc(256, sizeof(SLang_Key_Type)))) -     return NULL; - -   if (kml == NULL) return new_root; -   km = kml->keymap; - -   for (i = 0; i < 256; i++) -     { -	old = &(km[i]); -	neew = &(new_root[i]); - -	if (old->type == SLKEY_F_INTERPRET) -	  neew->f.s = SLang_create_slstring (old->f.s); -	else -	  neew->f.f = old->f.f; - -	neew->type = old->type; -	SLMEMCPY((char *) neew->str, (char *) old->str, (unsigned int) *old->str); - -	old = old->next; -	while (old != NULL) -	  { -	     neew->next = malloc_key((unsigned char *) old->str); -	     neew = neew->next; - -	     if (old->type == SLKEY_F_INTERPRET) -	       neew->f.s = SLang_create_slstring (old->f.s); -	     else -	       neew->f.f = old->f.f; - -	     neew->type = old->type; -	     old = old->next; -	  } -	neew->next = NULL; -     } -   return(new_root); -} - -SLKeyMap_List_Type *SLang_create_keymap(char *name, SLKeyMap_List_Type *map) -{ -   SLang_Key_Type *neew; -   SLKeyMap_List_Type *new_map; - -   if ((NULL == (neew = copy_keymap(map))) -       || (NULL == (new_map = add_keymap(name, neew)))) return NULL; - -   if (map != NULL) new_map -> functions = map -> functions; - -   return new_map; -} - -SLKeyMap_List_Type *SLang_find_keymap(char *name) -{ -   SLKeyMap_List_Type *kmap, *kmap_max; - -   kmap = SLKeyMap_List; -   kmap_max = kmap + SLANG_MAX_KEYMAPS; - -   while (kmap < kmap_max) -     { -	if ((kmap->name != NULL) -	    && (0 == strcmp (kmap->name, name))) -	  return kmap; - -	kmap++; -     } -   return NULL; -} | 
