home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best Objectech Shareware Selections
/
UNTITLED.iso
/
boss
/
word
/
text
/
019
/
keymap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
21KB
|
743 lines
/*
* Copyright (c) 1992 John E. Davis (davis@amy.tch.harvard.edu)
* All Rights Reserved.
*/
#include <stdio.h>
#include <string.h>
#include <setjmp.h>
#ifndef msdos
#ifndef VMS
#include <malloc.h>
#endif
#else
#include <alloc.h>
#endif
#include "buffer.h"
#include "cmds.h"
#include "paste.h"
#include "screen.h"
#include "window.h"
#include "text.h"
#include "ledit.h"
#include "keymap.h"
#include "sysdep.h"
#include "misc.h"
#include "display.h"
#include "file.h"
#include "slang.h"
jmp_buf Jump_Buffer;
typedef int (*Jed_fp)(void);
VOID *Last_Key_Function;
int *Repeat_Factor; /* repeats a key sequence if non null */
typedef struct Jed_Function_Type
{
char *name;
Jed_fp f;
}
Jed_Function_Type;
Jed_Function_Type Jed_Functions[] =
{
{"backward_delete_char", backward_delete_char_cmd},
{"backward_delete_char_untabify", backward_delete_char_untabify},
{"beep", beep},
{"begin_macro", begin_keyboard_macro},
{"bob", bob},
{"bol", bol},
{"brace_bra_cmd", brace_bra_cmd},
{"brace_ket_cmd", brace_ket_cmd},
{"capitalize_word", capitalize_word},
{"center_line", center_line},
{"copy_region", copy_to_pastebuffer},
{"delete_char_cmd", delete_char_cmd},
{"delete_word", delete_word},
{"digit_arg", digit_arg},
{"double_line", double_line},
{"downcase_word", downcase_word},
{"end_macro", end_keyboard_macro},
{"enlarge_window", enlarge_window},
{"eob", eob},
{"eol_cmd", eol_cmd},
{"evaluate_cmd", evaluate_cmd},
{"exchange",exchange_point_mark},
{"execute_macro", execute_keyboard_macro},
{"exit_jed", exit_jed},
{"exit_mini", exit_minibuffer},
{"find_file", find_file},
{"format_paragraph", text_format_paragraph},
{"goto_column", goto_column_cmd},
{"goto_line", goto_line_cmd},
{"goto_match", goto_match},
{"indent_line", indent_line},
{"insert_file", insert_file_cmd},
{"kbd_quit", kbd_quit},
{"kill_buffer", kill_buffer},
{"kill_line", kill_line},
{"kill_region", kill_region},
{"macro_query", macro_query},
{"mark_spot", mark_spot},
{"narrow", narrow_to_region},
{"narrow_paragraph", narrow_paragraph},
{"newline", newline},
{"newline_and_indent", newline_and_indent},
{"next_char_cmd", next_char_cmd},
{"next_line_cmd", next_line_cmd},
{"one_window", one_window},
{"other_window", other_window},
{"page_down", pagedown_cmd},
{"page_up", pageup_cmd},
{"pop_spot", pop_spot},
{"previous_char_cmd", previous_char_cmd},
{"previous_line_cmd", previous_line_cmd},
{"quoted_insert", quoted_insert},
{"redraw", redraw},
{"replace", replace},
{"save_buffers", save_some_buffers},
{"scroll_left", scroll_left},
{"scroll_right", scroll_right},
{"search_backward", search_backward_cmd},
{"search_forward", search_forward_cmd},
{"self_insert_cmd", ins_char_cmd},
{"set_mark_cmd", set_mark_cmd},
{"split_window", split_window},
{"switch_to_buffer", get_buffer},
{"sys_spawn_cmd", sys_spawn_cmd},
{"text_smart_quote", text_smart_quote},
{"transpose_lines", transpose_lines},
{"trim_whitespace", trim_whitespace},
{"upcase_word", upcase_word},
{"widen", widen},
{"write_buffer", write_buffer},
{"yank", yank},
{(char *) NULL, NULL}
};
Key_Type Global_Map[128];
Key_Type *Mini_Map;
#define MAX_KEYMAP_NAME_LEN 8
typedef struct KeyMap_List_Type
{
char name[MAX_KEYMAP_NAME_LEN + 1];
Key_Type *keymap;
}
KeyMap_List_Type;
#define MAX_KEYMAPS 10
KeyMap_List_Type KeyMap_List[MAX_KEYMAPS]; /* these better be inited to 0! */
int kbd_quit(void)
{
KeyBoard_Quit = 1;
msg_error("Quit!");
return(0);
}
void add_keymap(char *name, Key_Type *map)
{
int i;
for (i = 0; i < MAX_KEYMAPS; i++)
{
if (KeyMap_List[i].keymap == NULL)
{
KeyMap_List[i].keymap = map;
strncpy(KeyMap_List[i].name, name, MAX_KEYMAP_NAME_LEN);
(KeyMap_List[i].name)[MAX_KEYMAP_NAME_LEN] = 0;
return;
}
}
msg_error("Keymap quota exceeded");
}
VOID *find_function(char *name)
{
Jed_Function_Type *fp;
fp = Jed_Functions;
while((fp != NULL) && (fp->name != NULL))
{
if (!strcmp(fp->name, name)) return((VOID *) fp->f);
fp++;
}
return(NULL);
}
#define upcase(ch) (((ch <= 'z') && (ch >= 'a')) ? ch & 0xDF : ch)
#define lowcase(ch) (((ch <= 'Z') && (ch >= 'A')) ? ch | 0x20 : ch)
/* convert things like "^A" to "\001" with ^@ going to 128 */
char *process_keystring(char *s)
{
static char str[30], ch;
int i;
i = 0;
while (*s != 0)
{
ch = *s++;
if (*s) ch = upcase(ch);
if (ch == '^')
{
ch = *s++;
if (ch == 0)
{
str[i++] = '^';
break;
}
ch = upcase(ch);
if (ch == '?') ch = 127;
else if (ch == '@') ch = 128; else ch = ch - 'A' + 1;
}
str[i++] = ch;
}
str[i] = 0;
return(str);
}
Key_Type *malloc_key(unsigned char *str)
{
Key_Type *new;
if (NULL == (new = (Key_Type *) MALLOC(sizeof(Key_Type))))
{
exit_error("malloc_key: malloc error.");
}
strcpy(new->str, (char *) str);
return(new);
}
static char *Define_Key_Error = "Inconsistency in define key.";
void define_key1(char *s, VOID *f, char type, Key_Type *keymap)
{
int cmp, i, m, n, len;
Key_Type *key, *last, *new;
unsigned char *str;
str = (unsigned char *) process_keystring(s);
/* null char gets mapped to 128 */
/* if (128 == ( i = *str)) i = 0; */
i = (*str) & 0x7F;
key = (Key_Type *) &(keymap[i]);
n = strlen((char *) str);
if (n < 2)
{
if (key->next != NULL)
{
msg_error(Define_Key_Error);
return;
}
key->f = f;
key->type = type;
if (*str) strcpy(key->str, (char *) str); else *key->str = 0;
return;
}
/* insert the key definition */
while(1)
{
last = key;
key = key->next;
if ((key == NULL) || (key->str == NULL)) cmp = -1;
else
{
m = strlen(key->str);
len = m;
if (m > n) len = n;
cmp = strncmp((char *) str, key->str, len);
if ((m != n) && !cmp)
{
msg_error(Define_Key_Error);
return;
}
if ((m == n) && (!cmp)) cmp = strcmp((char *) str, key->str);
}
if (cmp == 0)
{
key->f = f;
key->type = type;
return;
}
else if (cmp < 0)
{
new = malloc_key(str);
new -> next = key;
last -> next = new;
new->f = f;
new->type = type;
return;
} /* else cmp > 0 */
}
}
void define_key(char *s, char *funct, Key_Type *keymap)
{
VOID *f;
char type;
f = find_function(funct);
if (f == NULL) /* assume interpreted */
{
if (NULL == (f = (VOID *) MALLOC(strlen(funct) + 1)))
{
exit_error("Malloc error in define key.");
}
strcpy((char *) f, funct);
type = F_INTERPRET;
}
else type = F_INTRINSIC;
define_key1(s, f, type, keymap);
}
void init_keymaps(void)
{
char simple[2], ch;
simple[1] = 0;
for (ch = ' '; ch < 127; ch++)
{
simple[0] = ch;
define_key1(simple, (VOID *) ins_char_cmd, F_INTRINSIC, Global_Map);
}
define_key1("^[1", (VOID *) digit_arg, F_INTRINSIC, Global_Map);
define_key1("^[2", (VOID *) digi