📄 macro.c
字号:
/* macro.c 13.03.04 */
/*
/ --------------------------------------------------------------
/ Copyright (C) 2004: Michael Braun
/ Kaetinger Muehlenweg 103 A
/ D-28816 Stuhr
/ --------------------------------------------------------------
/
/ macro handler fuer mbedit.c
/
*/
/************************/
/* include files */
/************************/
#include "config.h"
#include "global.h"
#include "standard.h"
#include "macro.h"
#include "mbedit.h"
#include "perform.h"
#include "kb_input.h"
#include "mon_outp.h"
#include "history.h"
#include "disp_hnd.h"
#include "err_mess.h"
#include "memo_hnd.h"
#include "mb_ctype.h"
#include "mousec.h"
#include "ansi_out.h"
/************************/
/* some defines */
/************************/
#define MAC_TEST 0
#define TEST_TABLES 0
/* use macro names case sensitive ? (AEDIT: yes !) */
#define MACRO_NAME_IGNORE_CASE 1
#if MACRO_NAME_IGNORE_CASE
#define namcmp stricmp
#else
#define namcmp strcmp
#endif
/************************/
/* local structures */
/************************/
/************************/
/* module definitions */
/************************/
#if (ACT_OP_SYSTEM == MS_DOS)
#define MACRO_FILE_NO 4 /* wg. Speicherplatz */
#else
#define MACRO_FILE_NO 8
#endif
static char macro_filename [MACRO_FILE_NO][BUF_256]; /* last macro filename */
static int macro_level [MACRO_FILE_NO];
static int mac_count = -1;
static int incl_level = 0;
#define MAC_ACT_IND (max(0,mac_count) % MACRO_FILE_NO)
struct KEY_TAB {int key;
char *string;
};
static const struct KEY_TAB key_tab [] = {
/* functions keys <F1>...<F10> */
KEY_F1 , "\\090",
KEY_F2 , "\\091",
KEY_F3 , "\\092",
KEY_F4 , "\\093",
KEY_F5 , "\\094",
KEY_F6 , "\\095",
KEY_F7 , "\\096",
KEY_F8 , "\\097",
KEY_F9 , "\\098",
KEY_F10 , "\\099",
/* SHIFT function keys */
SHIFT_F1 , "\\0A0",
SHIFT_F2 , "\\0A1",
SHIFT_F3 , "\\0A2",
SHIFT_F4 , "\\0A3",
SHIFT_F5 , "\\0A4",
SHIFT_F6 , "\\0A5",
SHIFT_F7 , "\\0A6",
SHIFT_F8 , "\\0A7",
SHIFT_F9 , "\\0A8",
SHIFT_F10, "\\0A9",
/* CTRL function keys */
CTRL_F1 , "\\0B0",
CTRL_F2 , "\\0B1",
CTRL_F3 , "\\0B2",
CTRL_F4 , "\\0B3",
CTRL_F5 , "\\0B4",
CTRL_F6 , "\\0B5",
CTRL_F7 , "\\0B6",
CTRL_F8 , "\\0B7",
CTRL_F9 , "\\0B8",
CTRL_F10 , "\\0B9",
/* ALT function keys */
ALT_F1 , "\\0C0",
ALT_F2 , "\\0C1",
ALT_F3 , "\\0C2",
ALT_F4 , "\\0C3",
ALT_F5 , "\\0C4",
ALT_F6 , "\\0C5",
ALT_F7 , "\\0C6",
ALT_F8 , "\\0C7",
ALT_F9 , "\\0C8",
ALT_F10 , "\\0C9",
/* cursor keys */
KEY_UP , "\\CU" ,
KEY_DOWN , "\\CD" ,
KEY_RIGHT , "\\CR" ,
KEY_LEFT , "\\CL" ,
KEY_HOME , "\\CH" ,
KEY_INS , "\\083",
KEY_DEL , "\\XF" ,
KEY_END , "\\081",
KEY_PGUP , "\\080",
KEY_PGDN , "\\082",
/* control cursor keys */
CTRL_PGUP , "\\089",
CTRL_HOME , "\\088",
CTRL_PGDN , "\\087",
CTRL_END , "\\086",
CTRL_RIGHT, "\\085",
CTRL_LEFT , "\\084",
/* control keys */
/* ^@ (no translation) */
0x01 , "\\XA" , /* ^A */
0x02 , "\\002", /* ^B */
/* ^C (no translation) */
0x04 , "\\004", /* ^D */
0x05 , "\\XE" , /* ^E */
0x06 , "\\XF" , /* ^F */
0x07 , "\\007", /* ^G */
0x08 , "\\RB" , /* ^H <backspace> */
0x09 , "\\TB" , /* ^I <tab> */
0x0a , "\\00A", /* ^J <lf> (vorher "\\0A") */
0x0b , "\\00B", /* ^K */
0x0c , "\\00C", /* ^L */
0x0d , "\\00D", /* ^M <cr> (vorher "\\0D") */
EOLN_INIT , "\\NL" , /* <cr><lf> (0x0d0a) */
0x0e , "\\XN" , /* ^N */
0x0f , "\\00F", /* ^O */
0x10 , "\\010", /* ^P */
0x11 , "\\011", /* ^Q */
0x12 , "\\XH" , /* ^R */
0x13 , "\\XS" , /* ^S */
0x14 , "\\CR" , /* ^T */
0x15 , "\\XU" , /* ^U */
0x16 , "\\016", /* ^V */
0x17 , "\\017", /* ^W */
0x18 , "\\XX" , /* ^X */
0x19 , "\\019", /* ^Y */
0x1a , "\\XZ" , /* ^Z */
0x1b , "\\BR" , /* ^[ <esc> */
0x1c , "\\CD" , /* ^\ */
0x1d , "\\CH" , /* ^] */
0x1e , "\\CU" , /* ^^ */
0x1f , "\\CL" , /* ^_ */
0x5c , "\\\\" , /* '\' <backslash> */
#if (ACT_OP_SYSTEM == SCO_UNIX)
0x7f , "\\XF" , /* statt KEY_DEL */
#else
0x7f , "\\RB" , /* Rubout */
#endif
SEQU_MM , "\\MM" , /* end of sequence */
SEQU_EM , "\\EM" , /* end of sequence */
COMM_STT , "\\*" , /* start of comment */
/* ab hier Erweiterung zu AEDIT */
/* CTRL diverse keys */
CTRL_2 , "\\0D@", /* CTRL 2 */
/* ALT diverse keys */
ALT_1 , "\\0D1", /* ALT 1 */
ALT_2 , "\\0D2", /* ALT 2 */
ALT_3 , "\\0D3", /* ALT 3 */
ALT_4 , "\\0D4", /* ALT 4 */
ALT_5 , "\\0D5", /* ALT 5 */
ALT_6 , "\\0D6", /* ALT 6 */
ALT_7 , "\\0D7", /* ALT 7 */
ALT_8 , "\\0D8", /* ALT 8 */
ALT_9 , "\\0D9", /* ALT 9 */
ALT_0 , "\\0D0", /* ALT 0 */
ALT_MIN , "\\0DM", /* ALT - */
ALT_EQU , "\\0DE", /* ALT = */
/* ALT alpha keys */
ALT_A , "\\0EA", /* ALT A */
ALT_B , "\\0EB", /* ALT B */
ALT_C , "\\0EC", /* ALT C */
ALT_D , "\\0ED", /* ALT D */
ALT_E , "\\0EE", /* ALT E */
ALT_F , "\\0EF", /* ALT F */
ALT_G , "\\0EG", /* ALT G */
ALT_H , "\\0EH", /* ALT H */
ALT_I , "\\0EI", /* ALT I */
ALT_J , "\\0EJ", /* ALT J */
ALT_K , "\\0EK", /* ALT K */
ALT_L , "\\0EL", /* ALT L */
ALT_M , "\\0EM", /* ALT M */
ALT_N , "\\0EN", /* ALT N */
ALT_O , "\\0EO", /* ALT O */
ALT_P , "\\0EP", /* ALT P */
ALT_Q , "\\0EQ", /* ALT Q */
ALT_R , "\\0ER", /* ALT R */
ALT_S , "\\0ES", /* ALT S */
ALT_T , "\\0ET", /* ALT T */
ALT_U , "\\0EU", /* ALT U */
ALT_V , "\\0EV", /* ALT V */
ALT_W , "\\0EW", /* ALT W */
ALT_X , "\\0EX", /* ALT X */
ALT_Y , "\\0EY", /* ALT Y */
ALT_Z , "\\0EZ" /* ALT Z */
};
/* -FF- */
static struct MACRO * top_of_macros;
static int stack_index;
static int macro_aborted;
static struct MACRO_STACK macro_stack [MAX_STACK_NUM];
/* -FF- */
int start_index (int len)
{
/* calculates the biggest power of 2 below len */
int ii;
len--; /* reduce by one */
for (ii = 0 ; ii < 16 ; ii++)
{
if (len == 1) /* found left most set bit ? */
return (1 << ii);
len >>= 1; /* shift right 1 bit */
} /* for ii */
return 0; /* never reached ! */
} /* start_index */
/* -FF- */
#if (MACRO_TUNING)
/*
The translation from macro string <--> key was done by a sequential
search in the list key_tab (array of structures).
For high speed operating, the list is copied into two sorted lists,
one sorted by key, one sorted by string. The search for the correct
entry is now done by successive approximation. That means: max. 8
iterations now instead of 130 before.
*/
static struct KEY_TAB sorted_by_key [lengthof(key_tab)];
static struct KEY_TAB sorted_by_string [lengthof(key_tab)];
static int start_index0;
static void drop_double_entries (void)
{
int ii, key0, key1;
char *string0, *string1;
for (ii = 1 ; ii < lengthof(key_tab) ; ii++)
{
key0 = sorted_by_string[ii-1].key;
string0 = sorted_by_string[ii-1].string;
key1 = sorted_by_string[ii ].key;
string1 = sorted_by_string[ii ].string;
if (stricmp (string0, string1) == 0)
{
if (key0 < key1)
sorted_by_string[ii ].key = key0;
else
sorted_by_string[ii-1].key = key1;
}
} /* for ii */
} /* drop_double_entries */
#if (TEST_TABLES)
static void test_tables (void)
{
int ii, key0, key1, key2;
char *string0, *string1, *string2;
printf ("\n test transformation there + back \n");
for (ii = 0 ; ii < lengthof(key_tab) ; ii++)
{
key1 = key_tab[ii].key;
string1 = key_2_string (key1);
string2 = string1;
key2 = string_2_key (&string1);
printf ("\n key = %04x, string = \"%s\"", key1, string2);
if (key1 != key2)
printf (", key2 = %04x", key2);
} /* for ii */
printf ("\n");
printf ("\n test double occurences \n");
key0 = 0;
string0 = '\0';
for (ii = 0 ; ii < lengthof(key_tab) ; ii++)
{
key1 = sorted_by_key [ii].key;
string1 = sorted_by_key [ii].string;
key2 = sorted_by_string[ii].key;
string2 = sorted_by_string[ii].string;
printf ("\n key = %04x, string = \"%s\"", key1, string1);
if (key0 == key1) printf ("***");
printf ("\t key = %04x, string = \"%s\"", key2, string2);
if (stricmp (string0, string2) == 0) printf ("***");
key0 = key1;
string0 = string2;
} /* for ii */
printf ("\n");
} /* test_tables */
#endif
void init_sorted_tables (void)
{
start_index0 = start_index (lengthof(key_tab) + 1);
/* tabellen kopieren */
memcpy (sorted_by_key , key_tab, sizeof(key_tab));
memcpy (sorted_by_string, key_tab, sizeof(key_tab));
/* tabellen sortieren */
qsort (sorted_by_key , lengthof(key_tab),
sizeof(struct KEY_TAB), comp_keys);
qsort (sorted_by_string, lengthof(key_tab),
sizeof(struct KEY_TAB), comp_strings);
drop_double_entries ();
#if (TEST_TABLES)
test_tables ();
#endif
return;
} /* init_sorted_tables */
#if (QSORT_FUNC_ANSI)
static int comp_keys (const void *kt1, const void *kt2)
#else
static int comp_keys (kt1, kt2)
const void *kt1;
const void *kt2;
#endif
{
return (((struct KEY_TAB *) kt1)->key -
((struct KEY_TAB *) kt2)->key);
} /* comp_keys */
#if (QSORT_FUNC_ANSI)
static int comp_strings (const void *kt1, const void *kt2)
#else
static int comp_strings (kt1, kt2)
const void *kt1;
const void *kt2;
#endif
{
return (stricmp (((struct KEY_TAB *) kt1)->string,
((struct KEY_TAB *) kt2)->string));
} /* comp_strings */
/* -FF- */
char * key_2_string (int key)
{
/* translate with sorted key table */
int index, delta, diff;
static char help [2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -