X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=actions.c;h=f0898367441e976519b20690d19a43d6ba0fa6a3;hp=1eddb068415fe9a2289aea10a4dd48006abfa8bc;hb=8dd62cb4ac4dbdf030e38d60c804bdc6e8c102b1;hpb=80a50f132c675003d47c4a97a75aae4a47af0903 diff --git a/actions.c b/actions.c index 1eddb068..f0898367 100644 --- a/actions.c +++ b/actions.c @@ -1,4 +1,4 @@ -const char actions_rcs[] = "$Id: actions.c,v 1.81 2012/03/09 18:06:13 fabiankeil Exp $"; +const char actions_rcs[] = "$Id: actions.c,v 1.86 2012/11/11 12:37:10 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/actions.c,v $ @@ -156,11 +156,7 @@ jb_err merge_actions (struct action_spec *dest, if (str) { freez(dest->string[i]); - dest->string[i] = strdup(str); - if (NULL == dest->string[i]) - { - return JB_ERR_MEMORY; - } + dest->string[i] = strdup_or_die(str); } } @@ -212,7 +208,7 @@ jb_err merge_actions (struct action_spec *dest, * 1 : dest = Destination of copy. * 2 : src = Source for copy. * - * Returns : N/A + * Returns : JB_ERR_OK or JB_ERR_MEMORY * *********************************************************************/ jb_err copy_action (struct action_spec *dest, @@ -232,11 +228,7 @@ jb_err copy_action (struct action_spec *dest, char * str = src->string[i]; if (str) { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } + str = strdup_or_die(str); dest->string[i] = str; } } @@ -403,7 +395,17 @@ jb_err get_action_token(char **line, char **name, char **value) str++; *value = str; - str = strchr(str, '}'); + /* The value ends with the first non-escaped closing curly brace */ + while ((str = strchr(str, '}')) != NULL) + { + if (str[-1] == '\\') + { + /* Overwrite the '\' so the action doesn't see it. */ + string_move(str-1, str); + continue; + } + break; + } if (str == NULL) { /* error */ @@ -739,11 +741,7 @@ jb_err merge_current_action (struct current_action_spec *dest, char * str = src->string[i]; if (str) { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } + str = strdup_or_die(str); freez(dest->string[i]); dest->string[i] = str; } @@ -1330,15 +1328,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid) * * buf + 1 to skip the leading '{' */ - actions_buf = strdup(buf + 1); - if (actions_buf == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } + actions_buf = strdup_or_die(buf + 1); /* check we have a trailing } and then trim it */ end = actions_buf + strlen(actions_buf) - 1; @@ -1391,16 +1381,9 @@ static int load_one_actions_file(struct client_state *csp, int fileid) char *version_string, *fields[3]; int num_fields; - if ((version_string = strdup(buf + 20)) == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } + version_string = strdup_or_die(buf + 20); - num_fields = ssplit(version_string, ".", fields, SZ(fields), 1, 1); + num_fields = ssplit(version_string, ".", fields, SZ(fields)); if (num_fields < 1 || atoi(fields[0]) == 0) { @@ -1482,14 +1465,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid) return 1; /* never get here */ } - if ((new_alias->name = strdup(buf)) == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory!", - csp->config->actions_file[fileid]); - return 1; /* never get here */ - } + new_alias->name = strdup_or_die(buf); strlcpy(actions_buf, start, sizeof(actions_buf)); @@ -1603,7 +1579,7 @@ char * actions_to_text(const struct action_spec *action) { unsigned long mask = action->mask; unsigned long add = action->add; - char *result = strdup(""); + char *result = strdup_or_die(""); struct list_entry * lst; /* sanity - prevents "-feature +feature" */ @@ -1692,7 +1668,7 @@ char * actions_to_html(const struct client_state *csp, { unsigned long mask = action->mask; unsigned long add = action->add; - char *result = strdup(""); + char *result = strdup_or_die(""); struct list_entry * lst; /* sanity - prevents "-feature +feature" */ @@ -1798,9 +1774,9 @@ char *current_action_to_html(const struct client_state *csp, { unsigned long flags = action->flags; struct list_entry * lst; - char *result = strdup(""); - char *active = strdup(""); - char *inactive = strdup(""); + char *result = strdup_or_die(""); + char *active = strdup_or_die(""); + char *inactive = strdup_or_die(""); #define DEFINE_ACTION_BOOL(__name, __bit) \ if (flags & __bit) \ @@ -1871,3 +1847,69 @@ char *current_action_to_html(const struct client_state *csp, } return result; } + + +/********************************************************************* + * + * Function : action_to_line_of_text + * + * Description : Converts a action spec to a single text line + * listing the enabled actions. + * + * Parameters : + * 1 : action = Current action spec to be converted + * + * Returns : A string. Caller must free it. + * Out-of-memory errors are fatal. + * + *********************************************************************/ +char *actions_to_line_of_text(const struct current_action_spec *action) +{ + char buffer[200]; + struct list_entry *lst; + char *active; + const unsigned long flags = action->flags; + + active = strdup_or_die(""); + +#define DEFINE_ACTION_BOOL(__name, __bit) \ + if (flags & __bit) \ + { \ + snprintf(buffer, sizeof(buffer), "+%s ", __name); \ + string_append(&active, buffer); \ + } \ + +#define DEFINE_ACTION_STRING(__name, __bit, __index) \ + if (flags & __bit) \ + { \ + snprintf(buffer, sizeof(buffer), "+%s{%s} ", \ + __name, action->string[__index]); \ + string_append(&active, buffer); \ + } \ + +#define DEFINE_ACTION_MULTI(__name, __index) \ + lst = action->multi[__index]->first; \ + while (lst != NULL) \ + { \ + snprintf(buffer, sizeof(buffer), "+%s{%s} ", \ + __name, lst->str); \ + string_append(&active, buffer); \ + lst = lst->next; \ + } \ + +#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ + +#include "actionlist.h" + +#undef DEFINE_ACTION_MULTI +#undef DEFINE_ACTION_STRING +#undef DEFINE_ACTION_BOOL +#undef DEFINE_ACTION_ALIAS + + if (active == NULL) + { + log_error(LOG_LEVEL_FATAL, "Out of memory in action_to_line_of_text()"); + } + + return active; +}