Ver Fonte

feat: improve %0~%99

dzp há 1 ano atrás
pai
commit
bbbb1e24fe
4 ficheiros alterados com 136 adições e 11 exclusões
  1. 64 0
      src/config.c
  2. 10 10
      src/substitute.c
  3. 5 1
      src/tintin.h
  4. 57 0
      src/trigger.c

+ 64 - 0
src/config.c

@@ -60,6 +60,8 @@ DO_CONFIG(config_verbatim);
 DO_CONFIG(config_verbatimchar);
 DO_CONFIG(config_verbose);
 DO_CONFIG(config_wordwrap);
+DO_CONFIG(config_extra_action_args);
+DO_CONFIG(config_extra_alias_args);
 DO_CONFIG(config_iac_ga);
 DO_CONFIG(config_multi_trigger);
 
@@ -306,6 +308,20 @@ struct config_type config_table[] =
 		config_wordwrap
 	},
 
+	{
+		"EXTRA ACTION ARGS",
+		"Enable extra action arguments",
+		"Disable extra action arguments",
+		config_extra_action_args
+	},
+
+	{
+		"EXTRA ALIAS ARGS",
+		"Enable extra alias arguments",
+		"Disable extra alias arguments",
+		config_extra_alias_args
+	},
+
 	{
 		"IAC GA",
 		"Don't strip IAC GA from server output",
@@ -1361,6 +1377,54 @@ DO_CONFIG(config_wordwrap)
 	return ses;
 }
 
+DO_CONFIG(config_extra_action_args)
+{
+	if (*arg2)
+	{
+		if (is_abbrev(arg2, "ON"))
+		{
+			SET_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ACTION_ARGS);
+		}
+		else if (is_abbrev(arg2, "OFF"))
+		{
+			DEL_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ACTION_ARGS);
+		}
+		else
+		{
+			show_error(ses, LIST_CONFIG, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
+
+			return NULL;
+		}
+	}
+	strcpy(arg2, HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ACTION_ARGS) ? "ON" : "OFF");
+
+	return ses;
+}
+
+DO_CONFIG(config_extra_alias_args)
+{
+	if (*arg2)
+	{
+		if (is_abbrev(arg2, "ON"))
+		{
+			SET_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS);
+		}
+		else if (is_abbrev(arg2, "OFF"))
+		{
+			DEL_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS);
+		}
+		else
+		{
+			show_error(ses, LIST_CONFIG, "#SYNTAX: #CONFIG {%s} <ON|OFF>", config_table[index].name);
+
+			return NULL;
+		}
+	}
+	strcpy(arg2, HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS) ? "ON" : "OFF");
+
+	return ses;
+}
+
 DO_CONFIG(config_iac_ga)
 {
 	if (*arg2)

+ 10 - 10
src/substitute.c

@@ -1634,8 +1634,15 @@ int substitute(struct session *ses, char *string, char *result, int flags)
 					}
 					else
 					{
+						int secure = 0;
+
 						i = is_digit(pti[2]) ? (pti[1] - '0') * 10 + pti[2] - '0' : pti[1] - '0';
 
+						if (HAS_BIT(flags, SUB_SEC) || (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS) && i >= 20 && i <= 39))
+						{
+							secure = 1;
+						}
+
 						ptt = gtd->vars[i];
 
 						while (*ptt)
@@ -1647,7 +1654,7 @@ int substitute(struct session *ses, char *string, char *result, int flags)
 								continue;
 							}
 
-							if (HAS_BIT(flags, SUB_SEC))
+							if (secure)
 							{
 								switch (*ptt)
 								{
@@ -1687,15 +1694,8 @@ int substitute(struct session *ses, char *string, char *result, int flags)
 									case '$':
 									case '&':
 									case '*':
-										if (is_variable(ses, ptt))
-										{
-											*pto++ = '\\';
-											*pto++ = *ptt;
-										}
-										else
-										{
-											*pto++ = *ptt;
-										}
+										*pto++ = '\\';
+										*pto++ = *ptt;
 										break;
 
 									case '@':

+ 5 - 1
src/tintin.h

@@ -650,6 +650,8 @@ enum operators
 #define CONFIG_FLAG_WORDWRAP          BV19
 #define CONFIG_FLAG_IAC_GA            BV30
 #define CONFIG_FLAG_MULTI_TRIGGER     BV31
+#define CONFIG_FLAG_EXTRA_ACTION_ARGS BV32
+#define CONFIG_FLAG_EXTRA_ALIAS_ARGS  BV33
 
 
 #define SES_FLAG_BUFFERUPDATE         BV01
@@ -1166,7 +1168,9 @@ struct tintin_data
 	char                    verbatim_char;
 	char                    repeat_char;
 	int                     match[303];
+	char                  * alias_name;
 	char                  * vars[100];
+	char                  * vars_raw[100];
 	char                  * cmds[100];
 	int                     args[100];
 	int                     varc;
@@ -1207,7 +1211,7 @@ struct session
 	int                     telopts;
 	int                     telopt_flag[8];
 	int                     event_flags;
-        int                     config_flags;
+	long                    config_flags;
 	int                     flags;
 	int                     charset;
 	char                  * session_host;

+ 57 - 0
src/trigger.c

@@ -85,6 +85,12 @@ void check_all_actions(struct session *ses, char *original, char *line, char *bu
 		{
 			show_debug(ses, LIST_ACTION, COLOR_DEBUG "#DEBUG ACTION " COLOR_BRACE "{" COLOR_STRING "%s" COLOR_BRACE "}", node->arg1);
 
+			if (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ACTION_ARGS))
+			{
+				RESTRING(gtd->vars[99], original);
+				RESTRING(gtd->vars[98], line);
+			}
+
 			substitute(ses, node->arg2, buf, SUB_ARG|SUB_SEC);
 
 			if (node->shots && --node->shots == 0)
@@ -131,6 +137,12 @@ void check_all_actions_multi(struct session *ses, char *original, char *stripped
 			}
 			show_debug(ses, LIST_ACTION, COLOR_DEBUG "#DEBUG MULTI ACTION " COLOR_BRACE "{" COLOR_STRING "%s" COLOR_BRACE "}", node->arg1);
 
+			if (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ACTION_ARGS))
+			{
+				RESTRING(gtd->vars[99], pto);
+				RESTRING(gtd->vars[98], pts);
+			}
+
 			substitute(ses, node->arg2, buf, SUB_ARG|SUB_SEC);
 
 			if (node->shots && --node->shots == 0)
@@ -216,6 +228,7 @@ int check_all_aliases(struct session *ses, char *input)
 	struct listnode *node;
 	struct listroot *root;
 	char *buf, *line, *arg;
+	char *buf2, *arg2;
 	int i;
 
 	root = ses->list[LIST_ALIAS];
@@ -232,6 +245,7 @@ int check_all_aliases(struct session *ses, char *input)
 	}
 
 	buf  = str_alloc_stack(0);
+	buf2 = str_alloc_stack(0);
 	line = str_alloc_stack(0);
 
 	substitute(ses, input, line, SUB_VAR|SUB_FUN);
@@ -253,14 +267,56 @@ int check_all_aliases(struct session *ses, char *input)
 						continue;
 					}
 					arg = &line[i + 1];
+					if (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS))
+					{
+						RESTRING(gtd->vars[90], node->arg1)
+						RESTRING(gtd->vars[80], node->group)
+						arg2 = &input[i + 1];
+					}
 				}
 				else
 				{
 					arg = &line[i];
+					if (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS))
+					{
+						RESTRING(gtd->vars[90], node->arg1)
+						RESTRING(gtd->vars[80], node->group)
+						arg2 = &input[i];
+					}
 				}
 
 				RESTRING(gtd->vars[0], arg)
+				if (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS))
+				{
+					RESTRING(gtd->vars[20], arg2)
+				}
+
+			// 这里因为是新加了一路流程,所以为了遵循最小 diff 原则,故意减少了一重缩进
+			if (HAS_BIT(ses->config_flags, CONFIG_FLAG_EXTRA_ALIAS_ARGS))
+			{
+				for (i = 1 ; i < 20 ; i++)
+				{
+					gtd->varc = i;
 
+					if (*arg == 0)
+					{
+						for(; i < 20; i++)
+						{
+							*gtd->vars[i] = 0;
+							*gtd->vars[i+20] = 0;
+						}
+						break;
+					}
+
+					arg = get_arg_in_braces(ses, arg, buf, GET_ONE);
+					arg2 = get_arg_in_braces(ses, arg2, buf2, GET_ONE);
+
+					RESTRING(gtd->vars[i], buf);
+					RESTRING(gtd->vars[i+20], buf2);
+				}
+			}
+			else
+			{
 				for (i = 1 ; i < 100 ; i++)
 				{
 					gtd->varc = i;
@@ -279,6 +335,7 @@ int check_all_aliases(struct session *ses, char *input)
 					RESTRING(gtd->vars[i], buf);
 				}
 			}
+		}
 
 			substitute(ses, node->arg2, buf, SUB_ARG);