exit SPAM_LIST, just extend rx_t with the needed informations.
[apps/madmutt.git] / lib-lib / buffer.c
1 /*
2  *  This program is free software; you can redistribute it and/or modify
3  *  it under the terms of the GNU General Public License as published by
4  *  the Free Software Foundation; either version 2 of the License, or (at
5  *  your option) any later version.
6  *
7  *  This program is distributed in the hope that it will be useful, but
8  *  WITHOUT ANY WARRANTY; without even the implied warranty of
9  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  *  General Public License for more details.
11  *
12  *  You should have received a copy of the GNU General Public License
13  *  along with this program; if not, write to the Free Software
14  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
15  *  MA 02110-1301, USA.
16  *
17  *  Copyright © 2006 Pierre Habouzit
18  */
19
20 /*
21  * Copyright notice from original mutt:
22  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
23  *
24  * This file is part of mutt-ng, see http://www.muttng.org/.
25  * It's licensed under the GNU General Public License,
26  * please see the file GPL in the top level source directory.
27  */
28
29 #include "lib-lib.h"
30
31 /*
32  * Creates and initializes a BUFFER*. If passed an existing BUFFER*,
33  * just initializes. Frees anything already in the buffer.
34  *
35  * Disregards the 'destroy' flag, which seems reserved for caller.
36  * This is bad, but there's no apparent protocol for it.
37  */
38 BUFFER *mutt_buffer_init(BUFFER *b)
39 {
40     if (!b) {
41         b = p_new(BUFFER, 1);
42     }
43     p_delete(&b->data);
44     p_clear(b, 1);
45     return b;
46 }
47
48 /*
49  * Creates and initializes a BUFFER*. If passed an existing BUFFER*,
50  * just initializes. Frees anything already in the buffer. Copies in
51  * the seed string.
52  *
53  * Disregards the 'destroy' flag, which seems reserved for caller.
54  * This is bad, but there's no apparent protocol for it.
55  */
56 BUFFER *mutt_buffer_from(BUFFER * b, const char *seed)
57 {
58     if (!seed)
59         return NULL;
60
61     b = mutt_buffer_init(b);
62     b->dsize = m_strlen(seed);
63     b->data  = m_strdup(seed);
64     b->dptr  = (char *)b->data + b->dsize;
65     return b;
66 }
67
68 void mutt_buffer_free(BUFFER **p)
69 {
70     if (p && *p) {
71         p_delete(&(*p)->data);
72         p_delete(p);
73     }
74 }
75
76 /* dynamically grows a BUFFER to accomodate s, in increments of 128 bytes.
77  * Always one byte bigger than necessary for the null terminator, and
78  * the buffer is always null-terminated */
79 void mutt_buffer_add(BUFFER *buf, const char *s, ssize_t len)
80 {
81     size_t offset;
82
83     if (buf->dptr + len + 1 > buf->data + buf->dsize) {
84         offset = buf->dptr - buf->data;
85         buf->dsize += ((len + 1 + 127) & ~127);
86         p_realloc(&buf->data, buf->dsize);
87         buf->dptr = buf->data + offset;
88     }
89     memcpy(buf->dptr, s, len);
90     buf->dptr += len;
91     *buf->dptr = '\0';
92 }
93