+#ifdef FEATURE_CGI_EDIT_ACTIONS
+/*********************************************************************
+ *
+ * Function : actions_to_html
+ *
+ * Description : Converts a actionsfile entry from numeric form
+ * ("mask" and "add") to a <br>-seperated HTML string.
+ *
+ * Parameters :
+ * 1 : mask = As from struct url_actions
+ * 2 : add = As from struct url_actions
+ *
+ * Returns : A string. Caller must free it.
+ * NULL on out-of-memory error.
+ *
+ *********************************************************************/
+char * actions_to_html(struct action_spec *action)
+{
+ unsigned mask = action->mask;
+ unsigned add = action->add;
+ char * result = strdup("");
+ char * enc_str;
+ struct list_entry * lst;
+
+ /* sanity - prevents "-feature +feature" */
+ mask |= add;
+
+
+#define DEFINE_ACTION_BOOL(__name, __bit) \
+ if (!(mask & __bit)) \
+ { \
+ string_append(&result, "\n<br>-" __name); \
+ } \
+ else if (add & __bit) \
+ { \
+ string_append(&result, "\n<br>+" __name); \
+ }
+
+#define DEFINE_ACTION_STRING(__name, __bit, __index) \
+ if (!(mask & __bit)) \
+ { \
+ string_append(&result, "\n<br>-" __name); \
+ } \
+ else if (add & __bit) \
+ { \
+ string_append(&result, "\n<br>+" __name "{"); \
+ if (NULL == result) \
+ { \
+ return NULL; \
+ } \
+ enc_str = html_encode(action->string[__index]);\
+ if (NULL == enc_str) \
+ { \
+ free(result); \
+ return NULL; \
+ } \
+ string_append(&result, enc_str); \
+ free(enc_str); \
+ string_append(&result, "}"); \
+ }
+
+#define DEFINE_ACTION_MULTI(__name, __index) \
+ if (action->multi_remove_all[__index]) \
+ { \
+ string_append(&result, "\n<br>-" __name); \
+ } \
+ else \
+ { \
+ lst = action->multi_remove[__index]->first; \
+ while (lst) \
+ { \
+ string_append(&result, "\n<br>-" __name "{");\
+ if (NULL == result) \
+ { \
+ return NULL; \
+ } \
+ enc_str = html_encode(lst->str); \
+ if (NULL == enc_str) \
+ { \
+ free(result); \
+ return NULL; \
+ } \
+ string_append(&result, enc_str); \
+ free(enc_str); \
+ string_append(&result, "}"); \
+ lst = lst->next; \
+ } \
+ } \
+ lst = action->multi_add[__index]->first; \
+ while (lst) \
+ { \
+ string_append(&result, "\n<br>+" __name "{"); \
+ if (NULL == result) \
+ { \
+ return NULL; \
+ } \
+ enc_str = html_encode(lst->str); \
+ if (NULL == enc_str) \
+ { \
+ free(result); \
+ return NULL; \
+ } \
+ string_append(&result, enc_str); \
+ free(enc_str); \
+ string_append(&result, "}"); \
+ 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
+
+ /* trim leading <br> */
+ if (result && *result)
+ {
+ char * s = result;
+ result = strdup(result + 5);
+ free(s);
+ }
+
+ return result;
+}
+#endif /* def FEATURE_CGI_EDIT_ACTIONS */
+
+