-const char actions_rcs[] = "$Id: actions.c,v 1.79 2012/03/09 16:23:50 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 $
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);
}
}
* 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,
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;
}
}
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 */
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;
}
*
* 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;
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), TRUE, FALSE);
+ num_fields = ssplit(version_string, ".", fields, SZ(fields));
if (num_fields < 1 || atoi(fields[0]) == 0)
{
csp->config->actions_file[fileid], linenum, buf);
}
else if ( (atoi(fields[0]) > VERSION_MAJOR)
- || ((num_fields) > 1 && (atoi(fields[1]) > VERSION_MINOR))
- || ((num_fields) > 2 && (atoi(fields[2]) > VERSION_POINT)))
+ || ((num_fields > 1) && (atoi(fields[1]) > VERSION_MINOR))
+ || ((num_fields > 2) && (atoi(fields[2]) > VERSION_POINT)))
{
fclose(fp);
log_error(LOG_LEVEL_FATAL,
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));
{
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" */
{
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" */
{
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) \
}
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;
+}