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

📄 macro.c

📁 功能强大的文本编辑器
💻 C
📖 第 1 页 / 共 5 页
字号:
static void drop_double_chars (char *string, size_t num)
{
int ii;

   for (ii = 1; ii < (int) num ; ii++)
   {
      if (string[ii] == string[ii-1])
      {
         memcpy (&string[ii-1], &string[ii], (num - ii + 1));
         num--;
         ii--;
      }
   }

   return;

}  /* drop_double_chars */


void normalize_delims (void)
{

/* sort delimiter set in ascending order */
   qsort (fc->e_delimit, strlen (fc->e_delimit),
                         1, comp_chars);

/* remove double values */
   drop_double_chars (fc->e_delimit, strlen (fc->e_delimit));

   return;

}  /* normalize_delims */

#endif

/* -FF-  */

int read_macro_file (char *filename, int store_filename)
{
struct MACRO *macro = NULL;
FILE *fp;
STATIC char parse_line [BUF_256];
char *parse_ptr, *max_ptr, *help_ptr;
char macro_name [81];
char *name_ptr;
int key, line_no, err_line;
char err_text [20];
enum FILE_STAT {  NORMAL,
                  MACRO_NAME,
                  MACRO_SEQUENCE,
                  COMMENT
               };
enum FILE_STAT file_stat, save_stat = NORMAL;

int  val, mode;

#if (ACT_OP_SYSTEM == OS_9)
#define BIG_BUFFER 32
#endif

#if BIG_BUFFER
static int read_level;
static char bigbuff [BIG_BUFFER*BUFSIZ];
#endif

int num, help_int, help_int2, help_int3;
char komma;

#define FILE_MUST_EXIST  1    /* NEU, konst. ! */

#if (ACT_SERVER == SERVER_VGA)
long attr;
#else
int ii;
#define LINE_LEN 16
char esc_line [LINE_LEN];
#endif


   err_line = 0;  /* default: no error */
   line_no  = 0;

/* anzeige */
   show_status_line_2 ("*** reading macro file ***", 0, -2, 0);

/* open datafile */
   fp = fopen (filename, "r");
   if (fp == NULL)           /* file doesn't exist */
   {
#if FILE_MUST_EXIST
      err_message (FILE_DOESN_T_EXIST);
      return -2;          /* error : abort --> */
#else
      return 0;           /* no bytes read */
#endif
   }

/* for speed up */
#if BIG_BUFFER
   if (read_level == 0)    /* only the first time */
      setvbuf (fp, bigbuff, _IOFBF, sizeof(bigbuff));
   read_level++;
#endif

/* read datafile */
#if MAC_TEST
   printf ("\015\012");
#endif

/* save <macro filename> for perform_special_keys () */
   if (store_filename)
   {
      mac_count++;
      macro_level[MAC_ACT_IND] = incl_level;
      strncpy (macro_filename[MAC_ACT_IND],
               filename,
               sizeof(macro_filename[0]));
   }


/* interprete macro file */
   file_stat = NORMAL;
   while (fgets (parse_line, sizeof(parse_line), fp) != NULL)
   {
      line_no++;
      max_ptr = &parse_line[min(strlen(parse_line),
                                sizeof(parse_line))-1];

#if MAC_TEST
      printf ("%s", parse_line);
#endif

      for (parse_ptr = parse_line ; (*parse_ptr != 0x0a) && (*parse_ptr != 0x0d) ; /* no ++ here ! */ )
      {
      /* for safety reasons ... */
         if (parse_ptr >= max_ptr)
         {
            err_line = line_no;
            break; 
         }
      
         switch (file_stat)
         {
            case NORMAL:
               switch (toupper(*parse_ptr))
               {
                  case 'I':  /* "INCLUDE macrofile" (exactly one <space> !) */
                     if (parse_ptr == parse_line)   /* column 0 only !! */
                     {
                        if (strnicmp (parse_ptr, "INCLUDE", 7) == 0)
                        {
                           parse_ptr += 8;   /* skip "INCLUDE " */

                        /* terminate filename */
                           help_ptr = parse_ptr;
                           for (help_ptr = parse_ptr ; ; help_ptr++)
                           {
                              if ((*help_ptr <= 0x20) || (*help_ptr >= 0x7f))
                              {
                                 *help_ptr = '\0';  /* forced end of string */
                                 break;
                              }
                           }

                        /* read include file */
                           incl_level++;
                           if (incl_level >= MAX_INCLUDE_NUM)
                              err_message (MACRO_INCLUDE_NESTING_TO_DEEP);
                           else
                              read_macro_file (parse_ptr, 1);  /* 25.11.95: 0 --> 1 */
                           incl_level--;
                        }
                        else
                        {
                           err_line = line_no;
                        }
                     }
                     *parse_ptr = EOLA;  /* forced end of parse_line */
                     break;

                  case 'M':   /* Macro */
                     if (parse_ptr == parse_line)   /* column 0 only !! */
                        file_stat = MACRO_NAME;

                     parse_ptr++;
                     break;

                  case 'A':
                     if (parse_ptr == parse_line)   /* column 0 only !! */
                     {
                        parse_ptr++;
                        switch (toupper(*parse_ptr))
                        {
                           case 'V':   /* number of lines on screen */
                              parse_ptr++;
                              parse_ptr++;       /* ignore '=' */
                              if (sscanf (parse_ptr, "%d", &ROWS) != 1)
                              {
                                 err_line = line_no;
                              }
                              ROWS = max (ROWS, STATUS_LINES + 1);
                              ROWS = min (ROWS, LIMIT_ROWS);
                              limit_windows ();
                              break;

                           case 'C':   /* number of columns on screen */
                              parse_ptr++;
                              parse_ptr++;       /* ignore '=' */
                              if (sscanf (parse_ptr, "%d", &COLUMNS) != 1)
                              {
                                 err_line = line_no;
                              }
                              COLUMNS = max (COLUMNS, 1);
                              COLUMNS = min (COLUMNS, LIMIT_COLUMNS);
                              break;

                           case 'G':   /* semi grafik ON/OFF */
                              parse_ptr++;
                              parse_ptr++;       /* ignore '=' */
                              if (sscanf (parse_ptr, "%d", &val) != 1)
                              {
                                 err_line = line_no;
                              }
                              set_grafik_status (val);
                              break;

#if (WITH_MOUSE)
                           case 'M':   /* mouse driver ON/OFF */
                              parse_ptr++;
                              parse_ptr++;       /* ignore '=' */
                              if (sscanf (parse_ptr, "%d", &val) != 1)
                              {
                                 err_line = line_no;
                              }
                              set_mouse_status (val);
                              break;
#endif

                           case 'S':   /* Auto Shift */
                              parse_ptr++;
                              parse_ptr++;       /* ignore '=' */
                              if (sscanf (parse_ptr, "%d", &val) != 1)
                              {
                                 err_line = line_no;
                              }
                              set_auto_shift (val);
                              break;

#if (ACT_OP_SYSTEM != MS_DOS) && (ACT_OP_SYSTEM != WIN_32)
                           case 'E':   /* Escape wait time */
                              parse_ptr++;
                              parse_ptr++;       /* ignore '=' */
                              if (sscanf (parse_ptr, "%d", &val) != 1)
                              {
                                 err_line = line_no;
                              }
                              esc_waittime = max (0, val);
                              break;
#endif

                           case 'F':   /* attribute (color) on screen */
                              parse_ptr++;
                              switch (mode = toupper(*parse_ptr))
                              {
                                 case 'N':  /* normal video  */
                                 case 'R':  /* reverse video */
                                 case '1':  /* status line 1 */
                                 case '2':  /* status line 1 */
#if (WITH_SYNTAX_HIGHLIGHTING)
                                 case 'C':  /* comment       */
                                 case 'K':  /* keyword       */
                                 case 'S':  /* string        */
#endif
                                    parse_ptr++;
                                    parse_ptr++;       /* ignore 'V' */
                                    parse_ptr++;       /* ignore '=' */
#if (ACT_SERVER == SERVER_VGA)
                                 /* vga codes */
                                    if (*parse_ptr != '\"')
                                    {
                                       if (sscanf (parse_ptr, "%lx", &attr)
                                                   != 1)
                                       {
                                          err_line = line_no;
                                       }
                                       else
                                       {
                                          switch (mode)
                                          {
                                             case 'N': set_default_attribute ((byte) attr); break;
                                             case 'R': set_invers_attribute  ((byte) attr); break;
                                             case '1': set_stat_1_attribute  ((byte) attr); break;
                                             case '2': set_stat_2_attribute  ((byte) attr); break;
#if (WITH_SYNTAX_HIGHLIGHTING)
                                             case 'C': set_comment_attribute ((byte) attr); break;
                                             case 'K': set_keyword_attribute ((byte) attr); break;
                                             case 'S': set_string_attribute  ((byte) attr); break;
#endif
                                             default : break;
                                          }
                                       }
                                    }
#else
                                 /* esc sequence for VT100 / ANSI */
                                    if (*parse_ptr == '\"')
                                    {
                                       parse_ptr++;

                                    /* read escape sequence */
                                       memset (esc_line, 0 , sizeof(esc_line));
                                       for (ii = 0 ; ii < (LINE_LEN-1) ; ii++)
                                       {
                                          esc_line [ii] = (char) *parse_ptr;
                                          parse_ptr++;
   
                                          if (*parse_ptr == '\"')  /* end of string */
                                             break;
                                       }  /* for ii */
   
                                    /* store <esc> sequence */
                                       switch (mode)
                                       {
                                          case 'N': set_default_attribute (esc_line); break;
                                          case 'R': set_invers_attribute  (esc_line); break;
                                          case '1': set_stat_1_attribute  (esc_line); break;
                                          case '2': set_stat_2_attribute  (esc_line); break;
#if (WITH_SYNTAX_HIGHLIGHTING)
                                          case 'C': set_comment_attribute (esc_line); break;
                                          case 'K': set_keyword_attribute (esc_line); break;
                                          case 'S': set_string_attribute  (esc_line); break;
#endif
                                          default : break;
                                       }
                                    }
#endif
                                    break;

                                 default:
                                    parse_ptr++;
                                    break;
                              }
                              break;

                           default:
                              parse_ptr++;
                              break;
                        }
                     }
                     parse_ptr++;
                     break;

                  case 'S':
                     if (parse_ptr == parse_line)   /* column 0 only !! */
                     {
                        parse_ptr++;
                        switch (toupper(*parse_ptr))
                        {
                           case 'A':   /* Auto <nl> */
                              parse_ptr++;
                              set.autonl = (toupper(*parse_ptr) == 'Y');
                              break;

                           case 'B':   /* Backup Files */
                              parse_ptr++;
                              set.bak_file = (toupper(*parse_ptr) == 'Y');
                              break;

                           case 'C':   /* Consider Case */
                              parse_ptr++;
                              set.c_case = (toupper(*parse_ptr) == 'Y');
                              break;

                           case 'D':   /* Display Macro Execution */
                              parse_ptr++;
                              set.display = (toupper(*parse_ptr) == 'Y');
                              break;

#if 0   /* (WITH_E_DELIMIT) not used any more */
                           case 'E':
                              parse_ptr++;
                              sscanf (parse_ptr, "%s", set.e_delimit);
                              normalize_delims ();
                              break;
#endif

                           case 'F':   /* File number */
                              parse_ptr++;
                              if (sscanf (parse_ptr, "%d", &set.file_num) != 1)
                              {
                                 err_line = line_no;
                              }
                              set.file_num = max (1,   /* minimum 1 file !! */
                                             min (MAX_FC_NUM, set.file_num));
                              break;

                           case 'H':   /* Display Highbit Characters as is */
                              parse_ptr++;
							  /* default */                   set.highbit_global = 0;  /* No   */
                              if (toupper(*parse_ptr) == 'Y') set.highbit_global = 1;  /* Yes  */
                              if (toupper(*parse_ptr) == 'A') set.highbit_global = 2;  /* Auto */
                           
							  set_highbit();
                              break;

                           case 'I':   /* Indent */
                              parse_ptr++;
                              set.indent = (toupper(*parse_ptr) == 'Y');
                              break;

                           case 'K':   /* k_token */
                              parse_ptr++;
                              set.k_token = (toupper(*parse_ptr) == 'Y');
                              break;

                           case 'M':   /* Margin */
                              parse_ptr++;

                              help_int  = set.margin[0];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -