⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macro.c

📁 功能强大的文本编辑器
💻 C
📖 第 1 页 / 共 5 页
字号:
/*      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 + -