NeoMutt  2022-04-29-145-g9b6a0e
Teaching an old dog new tricks
DOXYGEN
tags.c
Go to the documentation of this file.
1 
29 #include "config.h"
30 #include <stddef.h>
31 #include <stdbool.h>
32 #include <stdint.h>
33 #include "mutt/lib.h"
34 #include "config/lib.h"
35 #include "core/lib.h"
36 #include "tags.h"
37 
40 
51 static char *driver_tags_getter(struct TagList *head, bool show_hidden,
52  bool show_transformed, const char *filter)
53 {
54  if (!head)
55  return NULL;
56 
57  char *tags = NULL;
58  struct Tag *np = NULL;
59  STAILQ_FOREACH(np, head, entries)
60  {
61  if (filter && !mutt_str_equal(np->name, filter))
62  continue;
63  if (show_hidden || !np->hidden)
64  {
65  if (show_transformed && np->transformed)
66  mutt_str_append_item(&tags, np->transformed, ' ');
67  else
68  mutt_str_append_item(&tags, np->name, ' ');
69  }
70  }
71  return tags;
72 }
73 
83 void driver_tags_add(struct TagList *list, char *new_tag)
84 {
85  char *new_tag_transformed = mutt_hash_find(TagTransforms, new_tag);
86 
87  struct Tag *tn = mutt_mem_calloc(1, sizeof(struct Tag));
88  tn->name = new_tag;
89  tn->hidden = false;
90  tn->transformed = mutt_str_dup(new_tag_transformed);
91 
92  /* filter out hidden tags */
93  const struct Slist *c_hidden_tags = cs_subset_slist(NeoMutt->sub, "hidden_tags");
94  if (c_hidden_tags)
95  if (mutt_list_find(&c_hidden_tags->head, new_tag))
96  tn->hidden = true;
97 
98  STAILQ_INSERT_TAIL(list, tn, entries);
99 }
100 
107 void driver_tags_free(struct TagList *list)
108 {
109  if (!list)
110  return;
111 
112  struct Tag *np = STAILQ_FIRST(list);
113  struct Tag *next = NULL;
114  while (np)
115  {
116  next = STAILQ_NEXT(np, entries);
117  FREE(&np->name);
118  FREE(&np->transformed);
119  FREE(&np);
120  np = next;
121  }
122  STAILQ_INIT(list);
123 }
124 
133 char *driver_tags_get_transformed(struct TagList *list)
134 {
135  return driver_tags_getter(list, false, true, NULL);
136 }
137 
145 char *driver_tags_get(struct TagList *list)
146 {
147  return driver_tags_getter(list, false, false, NULL);
148 }
149 
158 char *driver_tags_get_with_hidden(struct TagList *list)
159 {
160  return driver_tags_getter(list, true, false, NULL);
161 }
162 
172 char *driver_tags_get_transformed_for(struct TagList *head, const char *name)
173 {
174  return driver_tags_getter(head, true, true, name);
175 }
176 
186 bool driver_tags_replace(struct TagList *head, const char *tags)
187 {
188  if (!head)
189  return false;
190 
191  driver_tags_free(head);
192 
193  if (tags)
194  {
195  struct ListHead hsplit = STAILQ_HEAD_INITIALIZER(hsplit);
196  mutt_list_str_split(&hsplit, tags, ' ');
197  struct ListNode *np = NULL;
198  STAILQ_FOREACH(np, &hsplit, entries)
199  {
200  driver_tags_add(head, np->data);
201  }
202  mutt_list_clear(&hsplit);
203  }
204  return true;
205 }
206 
210 static void tags_deleter(int type, void *obj, intptr_t data)
211 {
212  FREE(&obj);
213 }
214 
219 {
222 
225 }
226 
231 {
234 }
const struct Slist * cs_subset_slist(const struct ConfigSubset *sub, const char *name)
Get a string-list config item by name.
Definition: helpers.c:268
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
static void tags_deleter(int type, void *obj, intptr_t data)
Delete a tag - Implements hash_hdata_free_t -.
Definition: tags.c:210
void * mutt_hash_find(const struct HashTable *table, const char *strkey)
Find the HashElem data in a Hash Table element using a key.
Definition: hash.c:362
struct HashTable * mutt_hash_new(size_t num_elems, HashFlags flags)
Create a new Hash Table (with string keys)
Definition: hash.c:259
void mutt_hash_set_destructor(struct HashTable *table, hash_hdata_free_t fn, intptr_t fn_data)
Set the destructor for a Hash Table.
Definition: hash.c:301
void mutt_hash_free(struct HashTable **ptr)
Free a hash table.
Definition: hash.c:457
#define MUTT_HASH_STRDUP_KEYS
make a copy of the keys
Definition: hash.h:111
#define MUTT_HASH_STRCASECMP
use strcasecmp() to compare keys
Definition: hash.h:110
struct ListNode * mutt_list_find(const struct ListHead *h, const char *data)
Find a string in a List.
Definition: list.c:102
void mutt_list_clear(struct ListHead *h)
Free a list, but NOT its strings.
Definition: list.c:167
size_t mutt_list_str_split(struct ListHead *head, const char *src, char sep)
Split a string into a list using a separator char.
Definition: list.c:247
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
#define FREE(x)
Definition: memory.h:43
Convenience wrapper for the library headers.
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:250
void mutt_str_append_item(char **str, const char *item, char sep)
Add string to another separated by sep.
Definition: string.c:346
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:784
#define STAILQ_INIT(head)
Definition: queue.h:372
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:324
#define STAILQ_FIRST(head)
Definition: queue.h:350
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
#define STAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:389
#define STAILQ_NEXT(elm, field)
Definition: queue.h:400
A Hash Table.
Definition: hash.h:97
A List node for strings.
Definition: list.h:35
char * data
String.
Definition: list.h:36
Container for Accounts, Notifications.
Definition: neomutt.h:37
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
String list.
Definition: slist.h:47
struct ListHead head
List containing values.
Definition: slist.h:48
LinkedList Tag Element.
Definition: tags.h:39
bool hidden
Tag should be hidden.
Definition: tags.h:42
char * transformed
Transformed name.
Definition: tags.h:41
char * name
Tag name.
Definition: tags.h:40
static char * driver_tags_getter(struct TagList *head, bool show_hidden, bool show_transformed, const char *filter)
Get transformed tags.
Definition: tags.c:51
void driver_tags_cleanup(void)
Deinitialize structures used for tags.
Definition: tags.c:230
char * driver_tags_get_transformed_for(struct TagList *head, const char *name)
Get transformed tag for a tag name from a header.
Definition: tags.c:172
bool driver_tags_replace(struct TagList *head, const char *tags)
Replace all tags.
Definition: tags.c:186
void driver_tags_free(struct TagList *list)
Free tags from a header.
Definition: tags.c:107
struct HashTable * TagFormats
Hash Table of tag-formats (tag -> format string)
Definition: tags.c:39
void driver_tags_init(void)
Initialize structures used for tags.
Definition: tags.c:218
char * driver_tags_get_transformed(struct TagList *list)
Get transformed tags.
Definition: tags.c:133
char * driver_tags_get_with_hidden(struct TagList *list)
Get tags with hiddens.
Definition: tags.c:158
struct HashTable * TagTransforms
Lookup table of alternative tag names.
Definition: tags.c:38
void driver_tags_add(struct TagList *list, char *new_tag)
Add a tag to header.
Definition: tags.c:83
char * driver_tags_get(struct TagList *list)
Get tags.
Definition: tags.c:145
Driver based email tags.