📄 macro.c
字号:
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 + -