NeoMutt  2024-02-01-35-geee02f
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
tags.c File Reference

Driver based email tags. More...

#include "config.h"
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
#include "mutt/lib.h"
#include "config/lib.h"
#include "core/lib.h"
#include "tags.h"
+ Include dependency graph for tags.c:

Go to the source code of this file.

Functions

void tag_free (struct Tag **ptr)
 Free a Tag.
 
struct Tagtag_new (void)
 Create a new Tag.
 
void driver_tags_getter (struct TagList *tl, bool show_hidden, bool show_transformed, const char *filter, struct Buffer *tags)
 Get transformed tags separated by space.
 
void driver_tags_add (struct TagList *tl, char *new_tag)
 Add a tag to header.
 
void driver_tags_free (struct TagList *tl)
 Free tags from a header.
 
void driver_tags_get_transformed (struct TagList *tl, struct Buffer *tags)
 Get transformed tags separated by space.
 
void driver_tags_get (struct TagList *tl, struct Buffer *tags)
 Get tags all tags separated by space.
 
void driver_tags_get_with_hidden (struct TagList *tl, struct Buffer *tags)
 Get all tags, also hidden ones, separated by space.
 
void driver_tags_get_transformed_for (struct TagList *tl, const char *name, struct Buffer *tags)
 Get transformed tags for a tag name separated by space.
 
bool driver_tags_replace (struct TagList *tl, const char *tags)
 Replace all tags.
 
static void tags_deleter (int type, void *obj, intptr_t data)
 Free our hash table data - Implements hash_hdata_free_t -.
 
void driver_tags_init (void)
 Initialize structures used for tags.
 
void driver_tags_cleanup (void)
 Deinitialize structures used for tags.
 

Variables

struct HashTableTagTransforms = NULL
 Hash Table: "inbox" -> "i" - Alternative tag names.
 
struct HashTableTagFormats = NULL
 Hash Table: "inbox" -> "GI" - Tag format strings.
 

Detailed Description

Driver based email tags.

Authors
  • Mehdi Abaakouk
  • Richard Russon
  • Pietro Cerutti
  • Dennis Schön

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Definition in file tags.c.

Function Documentation

◆ tag_free()

void tag_free ( struct Tag **  ptr)

Free a Tag.

Parameters
ptrTag to free

Definition at line 48 of file tags.c.

49{
50 if (!ptr || !*ptr)
51 return;
52
53 struct Tag *tag = *ptr;
54 FREE(&tag->name);
55 FREE(&tag->transformed);
56
57 FREE(ptr);
58}
#define FREE(x)
Definition: memory.h:45
LinkedList Tag Element.
Definition: tags.h:42
char * transformed
Transformed name.
Definition: tags.h:44
char * name
Tag name.
Definition: tags.h:43
+ Here is the caller graph for this function:

◆ tag_new()

struct Tag * tag_new ( void  )

Create a new Tag.

Return values
ptrNew Tag

Definition at line 64 of file tags.c.

65{
66 return mutt_mem_calloc(1, sizeof(struct Tag));
67}
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_getter()

void driver_tags_getter ( struct TagList *  tl,
bool  show_hidden,
bool  show_transformed,
const char *  filter,
struct Buffer tags 
)

Get transformed tags separated by space.

Parameters
[in]tlList of tags
[in]show_hiddenShow hidden tags
[in]show_transformedShow transformed tags
[in]filterMatch tags to this string
[out]tagsString list of tags

Definition at line 77 of file tags.c.

79{
80 if (!tl)
81 return;
82
83 struct Tag *tag = NULL;
84 STAILQ_FOREACH(tag, tl, entries)
85 {
86 if (filter && !mutt_str_equal(tag->name, filter))
87 continue;
88 if (show_hidden || !tag->hidden)
89 {
90 if (show_transformed && tag->transformed)
91 buf_join_str(tags, tag->transformed, ' ');
92 else
93 buf_join_str(tags, tag->name, ' ');
94 }
95 }
96}
void buf_join_str(struct Buffer *buf, const char *str, char sep)
Join a buffer with a string separated by sep.
Definition: buffer.c:767
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:709
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
bool hidden
Tag should be hidden.
Definition: tags.h:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_add()

void driver_tags_add ( struct TagList *  tl,
char *  new_tag 
)

Add a tag to header.

Parameters
[in]tlList of tags
[in]new_tagString representing the new tag

Add a tag to the header tags

Note
The ownership of the string is passed to the TagList structure

Definition at line 107 of file tags.c.

108{
109 char *new_tag_transformed = mutt_hash_find(TagTransforms, new_tag);
110
111 struct Tag *tag = tag_new();
112 tag->name = new_tag;
113 tag->hidden = false;
114 tag->transformed = mutt_str_dup(new_tag_transformed);
115
116 /* filter out hidden tags */
117 const struct Slist *c_hidden_tags = cs_subset_slist(NeoMutt->sub, "hidden_tags");
118 if (c_hidden_tags)
119 if (mutt_list_find(&c_hidden_tags->head, new_tag))
120 tag->hidden = true;
121
122 STAILQ_INSERT_TAIL(tl, tag, entries);
123}
const struct Slist * cs_subset_slist(const struct ConfigSubset *sub, const char *name)
Get a string-list config item by name.
Definition: helpers.c:243
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 ListNode * mutt_list_find(const struct ListHead *h, const char *data)
Find a string in a List.
Definition: list.c:102
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:253
#define STAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:389
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:45
String list.
Definition: slist.h:37
struct ListHead head
List containing values.
Definition: slist.h:38
struct Tag * tag_new(void)
Create a new Tag.
Definition: tags.c:64
struct HashTable * TagTransforms
Hash Table: "inbox" -> "i" - Alternative tag names.
Definition: tags.c:41
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_free()

void driver_tags_free ( struct TagList *  tl)

Free tags from a header.

Parameters
[in]tlList of tags

Free the whole tags structure

Definition at line 131 of file tags.c.

132{
133 if (!tl)
134 return;
135
136 struct Tag *tag = STAILQ_FIRST(tl);
137 struct Tag *next = NULL;
138 while (tag)
139 {
140 next = STAILQ_NEXT(tag, entries);
141 tag_free(&tag);
142 tag = next;
143 }
144 STAILQ_INIT(tl);
145}
#define STAILQ_INIT(head)
Definition: queue.h:372
#define STAILQ_FIRST(head)
Definition: queue.h:350
#define STAILQ_NEXT(elm, field)
Definition: queue.h:400
void tag_free(struct Tag **ptr)
Free a Tag.
Definition: tags.c:48
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_get_transformed()

void driver_tags_get_transformed ( struct TagList *  tl,
struct Buffer tags 
)

Get transformed tags separated by space.

Parameters
[in]tlList of tags
[out]tagsString list of tags

Definition at line 152 of file tags.c.

153{
154 driver_tags_getter(tl, false, true, NULL, tags);
155}
void driver_tags_getter(struct TagList *tl, bool show_hidden, bool show_transformed, const char *filter, struct Buffer *tags)
Get transformed tags separated by space.
Definition: tags.c:77
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_get()

void driver_tags_get ( struct TagList *  tl,
struct Buffer tags 
)

Get tags all tags separated by space.

Parameters
[in]tlList of tags
[out]tagsString list of tags
Note
Hidden tags are not returned. Use driver_tags_get_with_hidden() for that.

Definition at line 164 of file tags.c.

165{
166 driver_tags_getter(tl, false, false, NULL, tags);
167}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_get_with_hidden()

void driver_tags_get_with_hidden ( struct TagList *  tl,
struct Buffer tags 
)

Get all tags, also hidden ones, separated by space.

Parameters
[in]tlList of tags
[out]tagsString list of tags

Definition at line 174 of file tags.c.

175{
176 driver_tags_getter(tl, true, false, NULL, tags);
177}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_get_transformed_for()

void driver_tags_get_transformed_for ( struct TagList *  tl,
const char *  name,
struct Buffer tags 
)

Get transformed tags for a tag name separated by space.

Parameters
[in]tlList of tags
[in]nameTag to transform
[out]tagsString list of tags
Note
Will also return hidden tags.

Definition at line 187 of file tags.c.

188{
189 driver_tags_getter(tl, true, true, name, tags);
190}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_replace()

bool driver_tags_replace ( struct TagList *  tl,
const char *  tags 
)

Replace all tags.

Parameters
[in]tlList of tags
[in]tagsstring of all tags separated by space
Return values
falseNo changes are made
trueTags are updated

Free current tags structures and replace it by new tags

Definition at line 201 of file tags.c.

202{
203 if (!tl)
204 return false;
205
207
208 if (tags)
209 {
210 struct ListHead hsplit = STAILQ_HEAD_INITIALIZER(hsplit);
211 mutt_list_str_split(&hsplit, tags, ' ');
212 struct ListNode *np = NULL;
213 STAILQ_FOREACH(np, &hsplit, entries)
214 {
215 driver_tags_add(tl, np->data);
216 }
217 mutt_list_clear(&hsplit);
218 }
219 return true;
220}
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
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:324
A List node for strings.
Definition: list.h:35
char * data
String.
Definition: list.h:36
void driver_tags_add(struct TagList *tl, char *new_tag)
Add a tag to header.
Definition: tags.c:107
void driver_tags_free(struct TagList *tl)
Free tags from a header.
Definition: tags.c:131
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_init()

void driver_tags_init ( void  )

Initialize structures used for tags.

Definition at line 233 of file tags.c.

234{
237
240}
static void tags_deleter(int type, void *obj, intptr_t data)
Free our hash table data - Implements hash_hdata_free_t -.
Definition: tags.c:225
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
#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 HashTable * TagFormats
Hash Table: "inbox" -> "GI" - Tag format strings.
Definition: tags.c:42
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ driver_tags_cleanup()

void driver_tags_cleanup ( void  )

Deinitialize structures used for tags.

Definition at line 245 of file tags.c.

246{
249}
void mutt_hash_free(struct HashTable **ptr)
Free a hash table.
Definition: hash.c:457
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ TagTransforms

struct HashTable* TagTransforms = NULL

Hash Table: "inbox" -> "i" - Alternative tag names.

Definition at line 41 of file tags.c.

◆ TagFormats

struct HashTable* TagFormats = NULL

Hash Table: "inbox" -> "GI" - Tag format strings.

Definition at line 42 of file tags.c.