diff options
author | Perberos <[email protected]> | 2011-11-14 18:24:48 -0300 |
---|---|---|
committer | Perberos <[email protected]> | 2011-11-14 18:24:48 -0300 |
commit | 312ba610a1e98fc656fb58178227d7d45a64494e (patch) | |
tree | 54a3c2b6084c80e63fb0526c6e7b8e01627acbd7 /mini-commander/src/macro.c | |
download | mate-applets-312ba610a1e98fc656fb58178227d7d45a64494e.tar.bz2 mate-applets-312ba610a1e98fc656fb58178227d7d45a64494e.tar.xz |
initial
Diffstat (limited to 'mini-commander/src/macro.c')
-rw-r--r-- | mini-commander/src/macro.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/mini-commander/src/macro.c b/mini-commander/src/macro.c new file mode 100644 index 00000000..060d4c50 --- /dev/null +++ b/mini-commander/src/macro.c @@ -0,0 +1,155 @@ +/* + * Mini-Commander Applet + * Copyright (C) 1998 Oliver Maruhn <[email protected]> + * + * Author: Oliver Maruhn <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <config.h> +#include <sys/types.h> +#include <string.h> +#include <stdlib.h> +#include <regex.h> + +#include "macro.h" +#include "preferences.h" + +/* search for the longest matching prefix */ +static MCMacro * +mc_macro_with_prefix (MCData *mc, + char *command) +{ + MCMacro *retval = NULL; + GSList *l; + int prefix_len_found = 0; + + for (l = mc->preferences.macros; l; l = l->next) { + MCMacro *macro = l->data; + int pattern_len; + + pattern_len = strlen (macro->pattern); + + if (pattern_len > prefix_len_found && + !strncmp (command, macro->pattern, pattern_len) && + (strstr (macro->command, "$1") || pattern_len == strlen (command))) { + /* found a matching prefix; + * if macro does not contain "$1" then the prefix has + * to to have the same length as the command + */ + prefix_len_found = pattern_len; + retval = macro; + } + } + + return retval; +} + +int +mc_macro_prefix_len (MCData *mc, + char *command) +{ + MCMacro *macro; + + macro = mc_macro_with_prefix (mc, command); + if (!macro) + return 0; + + return strlen (macro->pattern); +} + +int +mc_macro_prefix_len_wspace (MCData *mc, + char *command) +{ + char *c_ptr; + + c_ptr = command + mc_macro_prefix_len (mc, command); + + while (*c_ptr != '\0' && *c_ptr == ' ') + c_ptr++; + + return c_ptr - command; +} + +char * +mc_macro_get_prefix (MCData *mc, + char *command) +{ + MCMacro *macro; + + macro = mc_macro_with_prefix (mc, command); + if (!macro) + return NULL; + + return macro->pattern; +} + +void +mc_macro_expand_command (MCData *mc, + char *command) +{ + GSList *l; + char command_exec [1000]; + + command_exec [0] = '\0'; + + for (l = mc->preferences.macros; l; l = l->next) { + regmatch_t regex_matches [MC_MAX_NUM_MACRO_PARAMETERS]; + MCMacro *macro = l->data; + + if (regexec (¯o->regex, command, MC_MAX_NUM_MACRO_PARAMETERS, regex_matches, 0) != REG_NOMATCH) { + char placeholder [100]; + char *char_p; + int inside_placeholder; + int parameter_number; + + inside_placeholder = 0; + + for (char_p = macro->command; *char_p != '\0'; ++char_p) { + if (inside_placeholder == 0 && + *char_p == '\\' && + *(char_p + 1) >= '0' && + *(char_p + 1) <= '9') { + strcpy (placeholder, ""); + inside_placeholder = 1; + } else if (inside_placeholder && + (*(char_p + 1) < '0' || *(char_p + 1) > '9')) + inside_placeholder = 2; + + if (inside_placeholder == 0) + strncat (command_exec, char_p, 1); + else + strncat (placeholder, char_p, 1); + + if (inside_placeholder == 2) { + parameter_number = atoi (placeholder + 1); + + if (parameter_number <= MC_MAX_NUM_MACRO_PARAMETERS && + regex_matches [parameter_number].rm_eo > 0) + strncat (command_exec, + command + regex_matches [parameter_number].rm_so, + regex_matches [parameter_number].rm_eo - regex_matches [parameter_number].rm_so); + + inside_placeholder = 0; + } + } + } + } + + if (command_exec [0] != '\0') + strcpy (command, command_exec); +} |