- if (mutt_strcmp ("*", str) == 0)
- mutt_free_rx_list (l); /* ``unCMD *'' means delete all current entries */
- else
- {
- p = *l;
- last = NULL;
- while (p)
- {
- if (ascii_strcasecmp (str, p->rx->pattern) == 0)
- {
- mutt_free_regexp (&p->rx);
- if (last)
- last->next = p->next;
- else
- (*l) = p->next;
- FREE (&p);
- }
- else
- {
- last = p;
- p = p->next;
+static int parse_ifdef (BUFFER * tmp, BUFFER * s, unsigned long data,
+ BUFFER * err)
+{
+ int i, j, res = 0;
+ BUFFER token;
+
+ memset (&token, 0, sizeof (token));
+ mutt_extract_token (tmp, s, 0);
+
+ /* is the item defined as a variable or a function? */
+ if (!(res = (mutt_option_index (tmp->data) != -1)))
+ for (i = 0; !res && i < MENU_MAX; i++) {
+ struct binding_t *b = km_get_table (Menus[i].value);
+
+ if (!b)
+ continue;
+
+ for (j = 0; b[j].name; j++)
+ if (!ascii_strncasecmp (tmp->data, b[j].name, safe_strlen (tmp->data))
+ && (safe_strlen (b[j].name) == safe_strlen (tmp->data))) {
+ res = 1;
+ break;
+ }
+ }
+ /* check for feature_* */
+ if (!res) {
+ char *p = NULL;
+
+ i = 0;
+ j = safe_strlen (tmp->data);
+ /* need at least input of 'feature_X' */
+ if (j >= 7) {
+ p = tmp->data + 7;
+ j -= 7;
+ while (Features[i].name) {
+ if (safe_strlen (Features[i].name) == j &&
+ ascii_strncasecmp (Features[i].name, p, j)) {
+ res = 1;
+ break;
+ }
+ i++;