summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--comsat/action.c35
-rw-r--r--gnulib.modules3
-rw-r--r--include/mailutils/opool.h3
-rw-r--r--lib/mailcap.c43
-rw-r--r--libmailutils/base/opool.c22
-rw-r--r--libmailutils/cfg/parser.y1
-rw-r--r--libmailutils/url/urlstr.c14
-rw-r--r--mh/burst.c11
-rw-r--r--mh/mh_fmtgram.y17
-rw-r--r--mh/mh_format.c16
-rw-r--r--mh/mh_format.h6
-rw-r--r--mh/mhn.c141
-rw-r--r--mh/repl.c10
-rw-r--r--mh/whatnowenv.c8
-rw-r--r--mimeview/mimetypes.l72
-rw-r--r--mimeview/mimeview.h3
16 files changed, 200 insertions, 205 deletions
diff --git a/comsat/action.c b/comsat/action.c
index a9df4b937..c263d800b 100644
--- a/comsat/action.c
+++ b/comsat/action.c
@@ -19,9 +19,7 @@
#include <mailutils/io.h>
#include <mailutils/argcv.h>
#include <mailutils/prog.h>
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-#include <obstack.h>
+#include <mailutils/opool.h>
/* This module implements user-configurable actions for comsat. The
actions are kept in file .biffrc in the user's home directory and
@@ -42,7 +40,7 @@
When omitted, they default to 400, 5. */
static int
-expand_escape (char **pp, mu_message_t msg, struct obstack *stk)
+expand_escape (char **pp, mu_message_t msg, mu_opool_t pool)
{
char *p = *pp;
char *start, *sval, *namep;
@@ -56,15 +54,13 @@ expand_escape (char **pp, mu_message_t msg, struct obstack *stk)
switch (*++p) /* skip past $ */
{
case 'u':
- len = strlen (username);
- obstack_grow (stk, username, len);
+ mu_opool_appendz (pool, username);
*pp = p;
rc = 0;
break;
case 'h':
- len = strlen (hostname);
- obstack_grow (stk, hostname, len);
+ mu_opool_appendz (pool, hostname);
*pp = p;
rc = 0;
break;
@@ -85,10 +81,7 @@ expand_escape (char **pp, mu_message_t msg, struct obstack *stk)
namep[len] = 0;
if (mu_message_get_header (msg, &hdr) == 0
&& mu_header_aget_value (hdr, namep, &sval) == 0)
- {
- len = strlen (sval);
- obstack_grow (stk, sval, len);
- }
+ mu_opool_appendz (pool, sval);
free (namep);
*pp = p;
rc = 0;
@@ -131,7 +124,7 @@ expand_escape (char **pp, mu_message_t msg, struct obstack *stk)
size += s - q + 1;
q = s + 1;
}
- obstack_grow (stk, buf, size);
+ mu_opool_append (pool, buf, size);
}
mu_stream_destroy (&stream);
free (buf);
@@ -147,11 +140,11 @@ expand_line (const char *str, mu_message_t msg)
{
const char *p;
int c = 0;
- struct obstack stk;
+ mu_opool_t pool;
if (!*str)
return NULL;
- obstack_init (&stk);
+ mu_opool_create (&pool, 1);
for (p = str; *p; p++)
{
switch (*p)
@@ -161,22 +154,22 @@ expand_line (const char *str, mu_message_t msg)
if (*p)
{
c = mu_wordsplit_c_unquote_char (*p);
- obstack_1grow (&stk, c);
+ mu_opool_append_char (pool, c);
}
break;
case '$':
- if (expand_escape ((char**)&p, msg, &stk) == 0)
+ if (expand_escape ((char**)&p, msg, pool) == 0)
break;
/*FALLTHRU*/
default:
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
}
}
- obstack_1grow (&stk, 0);
- str = strdup (obstack_finish (&stk));
- obstack_free (&stk, NULL);
+ mu_opool_append_char (pool, 0);
+ str = strdup (mu_opool_finish (pool, NULL));
+ mu_opool_destroy (&pool);
return (char *)str;
}
diff --git a/gnulib.modules b/gnulib.modules
index ff44936db..afea68206 100644
--- a/gnulib.modules
+++ b/gnulib.modules
@@ -14,6 +14,5 @@ mbchar
mbiter
mbslen
mbswidth
-obstack
setenv
-stdint \ No newline at end of file
+stdint
diff --git a/include/mailutils/opool.h b/include/mailutils/opool.h
index 19eeef8fc..0d0841499 100644
--- a/include/mailutils/opool.h
+++ b/include/mailutils/opool.h
@@ -42,6 +42,9 @@ void mu_opool_clear (mu_opool_t opool);
/* Destroy the pool, reclaim any memory associated with it. */
void mu_opool_destroy (mu_opool_t *popool);
+/* Allocate SIZE bytes in the pool. */
+int mu_opool_alloc (mu_opool_t opool, size_t size);
+
/* Append to the current object N bytes pointed to by STR. */
int mu_opool_append (mu_opool_t opool, const void *str, size_t n);
diff --git a/lib/mailcap.c b/lib/mailcap.c
index 430878579..8125da7fd 100644
--- a/lib/mailcap.c
+++ b/lib/mailcap.c
@@ -19,9 +19,6 @@
#endif
#include <mailutils/mailutils.h>
#include <fnmatch.h>
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-#include <obstack.h>
#include <sys/wait.h>
#include <ctype.h>
@@ -241,7 +238,7 @@ mime_context_get_temp_file (struct mime_context *ctx, char **ptr)
}
-static struct obstack expand_stack;
+static mu_opool_t expand_pool;
static int
expand_string (struct mime_context *ct, char **pstr)
@@ -258,14 +255,14 @@ expand_string (struct mime_context *ct, char **pstr)
{
case 's':
mime_context_get_temp_file (ct, &s);
- obstack_grow (&expand_stack, s, strlen (s));
+ mu_opool_appendz (expand_pool, s);
rc = 1;
p += 2;
break;
case 't':
mime_context_get_content_type (ct, &s);
- obstack_grow (&expand_stack, s, strlen (s));
+ mu_opool_appendz (expand_pool, s);
p += 2;
break;
@@ -281,7 +278,7 @@ expand_string (struct mime_context *ct, char **pstr)
if (mime_context_get_content_type_value (ct,
q, p-q,
&s, &n) == 0)
- obstack_grow (&expand_stack, s, n);
+ mu_opool_append (expand_pool, s, n);
if (*p)
p++;
break;
@@ -293,19 +290,19 @@ expand_string (struct mime_context *ct, char **pstr)
break;
default:
- obstack_1grow (&expand_stack, p[0]);
+ mu_opool_append_char (expand_pool, p[0]);
}
break;
case '\\':
if (p[1])
{
- obstack_1grow (&expand_stack, p[1]);
+ mu_opool_append_char (expand_pool, p[1]);
p += 2;
}
else
{
- obstack_1grow (&expand_stack, p[0]);
+ mu_opool_append_char (expand_pool, p[0]);
p++;
}
break;
@@ -313,23 +310,23 @@ expand_string (struct mime_context *ct, char **pstr)
case '"':
if (p[1] == p[0])
{
- obstack_1grow (&expand_stack, '%');
+ mu_opool_append_char (expand_pool, '%');
p++;
}
else
{
- obstack_1grow (&expand_stack, p[0]);
+ mu_opool_append_char (expand_pool, p[0]);
p++;
}
break;
default:
- obstack_1grow (&expand_stack, p[0]);
+ mu_opool_append_char (expand_pool, p[0]);
p++;
}
}
- obstack_1grow (&expand_stack, 0);
- *pstr = obstack_finish (&expand_stack);
+ mu_opool_append_char (expand_pool, 0);
+ *pstr = mu_opool_finish (expand_pool, NULL);
return rc;
}
@@ -514,8 +511,8 @@ run_test (mu_mailcap_entry_t entry, struct mime_context *ctx)
struct mu_wordsplit ws;
char *str;
- obstack_blank (&expand_stack, size + 1);
- str = obstack_finish (&expand_stack);
+ mu_opool_alloc (expand_pool, size + 1);
+ str = mu_opool_finish (expand_pool, NULL);
mu_mailcap_entry_get_test (entry, str, size + 1, NULL);
expand_string (ctx, &str);
@@ -556,8 +553,8 @@ run_mailcap (mu_mailcap_entry_t entry, struct mime_context *ctx)
if (mu_mailcap_entry_get_viewcommand (entry, NULL, 0, &size))
return 1;
size++;
- obstack_blank (&expand_stack, size);
- view_command = obstack_finish (&expand_stack);
+ mu_opool_alloc (expand_pool, size);
+ view_command = mu_opool_finish (expand_pool, NULL);
mu_mailcap_entry_get_viewcommand (entry, view_command, size, NULL);
}
else
@@ -565,8 +562,8 @@ run_mailcap (mu_mailcap_entry_t entry, struct mime_context *ctx)
if (mu_mailcap_entry_get_value (entry, "print", NULL, 0, &size))
return 1;
size++;
- obstack_blank (&expand_stack, size);
- view_command = obstack_finish (&expand_stack);
+ mu_opool_alloc (expand_pool, size);
+ view_command = mu_opool_finish (expand_pool, NULL);
mu_mailcap_entry_get_value (entry, "print", view_command, size, NULL);
}
@@ -691,7 +688,7 @@ display_stream_mailcap (const char *ident, mu_stream_t stream, mu_header_t hdr,
mailcap_path = mailcap_path_tmp;
}
- obstack_init (&expand_stack);
+ mu_opool_create (&expand_pool, 1);
ws.ws_delim = ":";
if (mu_wordsplit (mailcap_path, &ws,
@@ -712,7 +709,7 @@ display_stream_mailcap (const char *ident, mu_stream_t stream, mu_header_t hdr,
}
mu_wordsplit_free (&ws);
}
- obstack_free (&expand_stack, NULL);
+ mu_opool_destroy (&expand_pool);
free (mailcap_path_tmp);
mime_context_release (&ctx);
return rc;
diff --git a/libmailutils/base/opool.c b/libmailutils/base/opool.c
index 27b9a948e..51c8e91e0 100644
--- a/libmailutils/base/opool.c
+++ b/libmailutils/base/opool.c
@@ -168,6 +168,25 @@ mu_opool_destroy (mu_opool_t *popool)
}
int
+mu_opool_alloc (mu_opool_t opool, size_t size)
+{
+ while (size)
+ {
+ size_t rest;
+
+ if (!opool->head || opool->tail->level == opool->tail->size)
+ if (alloc_pool (opool, opool->bucket_size))
+ return ENOMEM;
+ rest = opool->tail->size - opool->tail->level;
+ if (size < rest)
+ rest = size;
+ opool->tail->level += rest;
+ size -= rest;
+ }
+ return 0;
+}
+
+int
mu_opool_append (mu_opool_t opool, const void *str, size_t n)
{
const char *ptr = str;
@@ -191,8 +210,7 @@ mu_opool_append_char (mu_opool_t opool, char c)
int
mu_opool_appendz (mu_opool_t opool, const char *str)
{
- return mu_opool_append (opool, str, strlen (str))
- || mu_opool_append_char (opool, 0);
+ return mu_opool_append (opool, str, strlen (str));
}
size_t
diff --git a/libmailutils/cfg/parser.y b/libmailutils/cfg/parser.y
index 2b9313611..55780a30f 100644
--- a/libmailutils/cfg/parser.y
+++ b/libmailutils/cfg/parser.y
@@ -1475,6 +1475,7 @@ mu_cfg_tree_create_node (struct mu_cfg_tree *tree,
{
mu_opool_clear (tree->pool);
mu_opool_appendz (tree->pool, label);
+ mu_opool_append_char (tree->pool, 0);
val.v.string = mu_opool_finish (tree->pool, NULL);
np->label = config_value_dup (&val);
}
diff --git a/libmailutils/url/urlstr.c b/libmailutils/url/urlstr.c
index 86e525021..1e2aecbb1 100644
--- a/libmailutils/url/urlstr.c
+++ b/libmailutils/url/urlstr.c
@@ -35,27 +35,27 @@ url_reconstruct_to_pool (mu_url_t url, mu_opool_t pool)
{
int i;
- mu_opool_append (pool, url->scheme, strlen (url->scheme));
+ mu_opool_appendz (pool, url->scheme);
mu_opool_append (pool, "://", 3);
if (url->flags & MU_URL_USER)
- mu_opool_append (pool, url->user, strlen (url->user));
+ mu_opool_appendz (pool, url->user);
if (url->flags & MU_URL_SECRET)
mu_opool_append (pool, ":***", 4); /* FIXME: How about MU_URL_PARSE_HIDEPASS? */
if (url->flags & MU_URL_AUTH)
{
mu_opool_append (pool, AUTH_PFX, sizeof AUTH_PFX - 1);
- mu_opool_append (pool, url->auth, strlen (url->auth));
+ mu_opool_appendz (pool, url->auth);
}
if (url->flags & MU_URL_HOST)
{
if (url->flags & (MU_URL_USER|MU_URL_SECRET|MU_URL_AUTH))
mu_opool_append_char (pool, '@');
- mu_opool_append (pool, url->host, strlen (url->host));
+ mu_opool_appendz (pool, url->host);
if (url->flags & MU_URL_PORT)
{
mu_opool_append_char (pool, ':');
- mu_opool_append (pool, url->portstr, strlen (url->portstr));
+ mu_opool_appendz (pool, url->portstr);
}
}
else if (url->flags & (MU_URL_USER|MU_URL_SECRET|MU_URL_AUTH))
@@ -65,7 +65,7 @@ url_reconstruct_to_pool (mu_url_t url, mu_opool_t pool)
{
if (url->flags & MU_URL_HOST)
mu_opool_append_char (pool, '/');
- mu_opool_append (pool, url->path, strlen (url->path));
+ mu_opool_appendz (pool, url->path);
}
if (url->flags & MU_URL_PARAM)
@@ -93,7 +93,7 @@ url_reconstruct_to_pool (mu_url_t url, mu_opool_t pool)
}
else if (url->flags == MU_URL_PATH)
{
- mu_opool_append (pool, url->path, strlen (url->path));
+ mu_opool_appendz (pool, url->path);
return 0;
}
return MU_ERR_URL_MISS_PARTS;
diff --git a/mh/burst.c b/mh/burst.c
index c07657ffb..c2848e5bc 100644
--- a/mh/burst.c
+++ b/mh/burst.c
@@ -17,9 +17,6 @@
/* MH burst command */
#include <mh.h>
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-#include <obstack.h>
static char doc[] = N_("GNU MH burst")"\v"
N_("Options marked with `*' are not yet implemented.\n\
@@ -134,7 +131,7 @@ struct burst_map map; /* Currently built map */
struct burst_map *burst_map; /* Finished burst map */
size_t burst_count; /* Number of items in burst_map */
mu_mailbox_t tmpbox; /* Temporary mailbox */
-struct obstack stk; /* Stack for building burst_map, etc. */
+mu_opool_t pool; /* Object pool for building burst_map, etc. */
static int burst_or_copy (mu_message_t msg, int recursive, int copy);
@@ -592,7 +589,7 @@ burst (size_t num, mu_message_t msg, void *data)
mu_umaxtostr (1, num)));
if (inplace)
{
- obstack_grow (&stk, &map, sizeof map);
+ mu_opool_append (pool, &map, sizeof map);
burst_count++;
}
}
@@ -752,7 +749,7 @@ main (int argc, char **argv)
mu_attribute_set_deleted (attr);
}
mu_mailbox_expunge (tmpbox);
- obstack_init (&stk);
+ mu_opool_create (&pool, 1);
}
else
tmpbox = mbox;
@@ -769,7 +766,7 @@ main (int argc, char **argv)
size_t count;
const char *dir;
- burst_map = obstack_finish (&stk);
+ burst_map = mu_opool_finish (pool, NULL);
mu_mailbox_uidnext (mbox, &next_uid);
for (i = 0, last_uid = next_uid-1; i < burst_count; i++)
diff --git a/mh/mh_fmtgram.y b/mh/mh_fmtgram.y
index ac67415d2..6dd0f2dfd 100644
--- a/mh/mh_fmtgram.y
+++ b/mh/mh_fmtgram.y
@@ -17,9 +17,6 @@
along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
#include <mh.h>
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-#include <obstack.h>
int yyerror (const char *s);
int yylex ();
@@ -27,7 +24,7 @@ int yylex ();
static mh_format_t format; /* Format structure being built */
static size_t pc; /* Program counter. Poins to current
cell in format.prog */
-static struct obstack stack; /* Temporary token storage */
+static mu_opool_t tokpool; /* Temporary token storage */
#define FORMAT_INC 64 /* Increase format.prog by that many
cells each time pc reaches
@@ -459,16 +456,16 @@ yylex ()
if (*curp == '\\')
{
int c = backslash (*++curp);
- obstack_1grow (&stack, c);
+ mu_opool_append_char (tokpool, c);
}
else
- obstack_1grow (&stack, *curp);
+ mu_opool_append_char (tokpool, *curp);
curp++;
}
while (*curp && (expect_arg ? *curp != ')' : !isdelim(*curp)));
- obstack_1grow (&stack, 0);
- yylval.str = obstack_finish (&stack);
+ mu_opool_append_char (tokpool, 0);
+ yylval.str = mu_opool_finish (tokpool, NULL);
if (want_function)
{
@@ -502,7 +499,7 @@ mh_format_parse (char *format_str, mh_format_t *fmt)
if (p)
yydebug = 1;
start = curp = format_str;
- obstack_init (&stack);
+ mu_opool_create (&tokpool, 1);
format.prog = NULL;
format.progsize = 0;
pc = 0;
@@ -513,7 +510,7 @@ mh_format_parse (char *format_str, mh_format_t *fmt)
rc = yyparse ();
mh_code_op (mhop_stop);
- obstack_free (&stack, NULL);
+ mu_opool_destroy (&tokpool);
if (rc)
{
mh_format_free (&format);
diff --git a/mh/mh_format.c b/mh/mh_format.c
index fc51edf48..ef5b957d9 100644
--- a/mh/mh_format.c
+++ b/mh/mh_format.c
@@ -190,7 +190,7 @@ put_string (struct mh_machine *mach, char *str, int len)
{
if (len == 0)
return;
- obstack_grow (&mach->stk, str, len);
+ mu_opool_append (mach->pool, str, len);
len = mbsnwidth (str, len, 0);
mach->ind += len;
}
@@ -339,7 +339,7 @@ print_fmt_segment (struct mh_machine *mach, size_t fmtwidth, char *str,
fmtwidth -= width;
mach->ind += fmtwidth;
while (fmtwidth--)
- obstack_1grow (&mach->stk, ' ');
+ mu_opool_append_char (mach->pool, ' ');
}
}
@@ -394,7 +394,7 @@ format_num (struct mh_machine *mach, long num)
ptr = buf;
for (i = n; i < fmtwidth && mach->ind < mach->width;
i++, mach->ind++)
- obstack_1grow (&mach->stk, padchar);
+ mu_opool_append_char (mach->pool, padchar);
}
}
else
@@ -422,7 +422,7 @@ format_str (struct mh_machine *mach, char *str)
n = fmtwidth - len;
for (i = 0; i < n && mach->ind < mach->width;
i++, mach->ind++, fmtwidth--)
- obstack_1grow (&mach->stk, padchar);
+ mu_opool_append_char (mach->pool, padchar);
}
print_fmt_string (mach, fmtwidth, str);
@@ -491,7 +491,7 @@ mh_format (mh_format_t *fmt, mu_message_t msg, size_t msgno,
mach.width = width - 1; /* Count the newline */
mach.pc = 1;
- obstack_init (&mach.stk);
+ mu_opool_create (&mach.pool, 1);
mu_list_create (&mach.addrlist);
reset_fmt_defaults (&mach);
@@ -678,10 +678,10 @@ mh_format (mh_format_t *fmt, mu_message_t msg, size_t msgno,
if (pret)
{
- obstack_1grow (&mach.stk, 0);
- *pret = mu_strdup (obstack_finish (&mach.stk));
+ mu_opool_append_char (mach.pool, 0);
+ *pret = mu_strdup (mu_opool_finish (mach.pool, NULL));
}
- obstack_free (&mach.stk, NULL);
+ mu_opool_destroy (&mach.pool);
return mach.ind;
}
diff --git a/mh/mh_format.h b/mh/mh_format.h
index d2c6309e1..cff57a0ad 100644
--- a/mh/mh_format.h
+++ b/mh/mh_format.h
@@ -14,10 +14,6 @@
You should have received a copy of the GNU General Public License
along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-#include <obstack.h>
-
typedef struct /* A string object type */
{
int size; /* Allocated size or 0 for static storage */
@@ -43,7 +39,7 @@ struct mh_machine
mh_instr_t *prog; /* Program itself */
int stop; /* Stop execution immediately */
- struct obstack stk; /* Output buffer */
+ mu_opool_t pool; /* Output buffer */
size_t width; /* Output buffer width */
size_t ind; /* Output buffer index */
diff --git a/mh/mhn.c b/mh/mhn.c
index e209f1f97..3c1882410 100644
--- a/mh/mhn.c
+++ b/mh/mhn.c
@@ -19,9 +19,6 @@
#include <mh.h>
#include <signal.h>
#include <mailutils/mime.h>
-#define obstack_chunk_alloc mu_alloc
-#define obstack_chunk_free free
-#include <obstack.h>
#include <setjmp.h>
static char doc[] = N_("GNU MH mhn")"\v"
@@ -541,7 +538,7 @@ msg_part_format (msg_part_t p)
}
void
-msg_part_format_stk (struct obstack *stk, msg_part_t p)
+msg_part_format_pool (mu_opool_t pool, msg_part_t p)
{
int i;
@@ -551,11 +548,11 @@ msg_part_format_stk (struct obstack *stk, msg_part_t p)
const char *buf;
if (i > 1)
- obstack_1grow (stk, '.');
+ mu_opool_append_char (pool, '.');
buf = mu_umaxtostr (0, p->part[i]);
len = strlen (buf);
- obstack_grow (stk, buf, len);
+ mu_opool_append (pool, buf, len);
}
}
@@ -634,7 +631,7 @@ mhn_compose_command (char *typestr, char *typeargs, int *flags, char *file)
const char *p, *str;
char *type, *subtype, **typeargv = NULL;
int typeargc = 0;
- struct obstack stk;
+ mu_opool_t pool;
split_content (typestr, &type, &subtype);
str = _mhn_profile_get ("compose", type, subtype, NULL);
@@ -647,7 +644,8 @@ mhn_compose_command (char *typestr, char *typeargs, int *flags, char *file)
%F %f, and stdout is not redirected
%s subtype */
- obstack_init (&stk);
+ mu_opool_create (&pool, 1);
+
p = mu_str_skip_class (str, MU_CTYPE_SPACE);
if (*p == '|')
@@ -671,8 +669,8 @@ mhn_compose_command (char *typestr, char *typeargs, int *flags, char *file)
for (i = 0; i < typeargc; i++)
{
if (i > 0)
- obstack_1grow (&stk, ' ');
- obstack_grow (&stk, typeargv[i], strlen (typeargv[i]));
+ mu_opool_append_char (pool, ' ');
+ mu_opool_appendz (pool, typeargv[i]);
}
}
break;
@@ -682,36 +680,36 @@ mhn_compose_command (char *typestr, char *typeargs, int *flags, char *file)
*flags |= MHN_STDIN;
/*FALLTHRU*/
case 'f':
- obstack_grow (&stk, file, strlen (file));
+ mu_opool_appendz (pool, file);
break;
case 's':
/* subtype */
- obstack_grow (&stk, subtype, strlen (subtype));
+ mu_opool_appendz (pool, subtype);
break;
default:
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
p++;
}
}
else
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
}
- obstack_1grow (&stk, 0);
+ mu_opool_append_char (pool, 0);
free (type);
free (subtype);
mu_argcv_free (typeargc, typeargv);
- str = obstack_finish (&stk);
+ str = mu_opool_finish (pool, NULL);
p = mu_str_skip_class (str, MU_CTYPE_SPACE);
if (!*p)
str = NULL;
else
str = mu_strdup (p);
- obstack_free (&stk, NULL);
+ mu_opool_destroy (&pool);
return (char*) str;
}
@@ -767,7 +765,7 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
{
const char *p, *str, *tmp;
char *typestr, *type, *subtype, *typeargs;
- struct obstack stk;
+ mu_opool_t pool;
mu_header_t hdr;
char *temp_cmd = NULL;
int typeargc = 0;
@@ -827,7 +825,8 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
%s subtype
%d content description */
- obstack_init (&stk);
+ mu_opool_create (&pool, 1);
+
p = mu_str_skip_class (str, MU_CTYPE_SPACE);
if (*p == '|')
@@ -851,8 +850,8 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
for (i = 0; i < typeargc; i++)
{
if (i > 0)
- obstack_1grow (&stk, ' ');
- obstack_grow (&stk, typeargv[i], strlen (typeargv[i]));
+ mu_opool_append_char (pool, ' ');
+ mu_opool_appendz (pool, typeargv[i]);
}
}
break;
@@ -866,7 +865,7 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
/* filename containing content */
if (!*tempfile)
mhn_tempfile_name (tempfile, type, subtype);
- obstack_grow (&stk, *tempfile, strlen (*tempfile));
+ mu_opool_appendz (pool, *tempfile);
break;
case 'F':
@@ -874,7 +873,7 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
*flags |= MHN_STDIN|MHN_EXCLUSIVE_EXEC;
if (!*tempfile)
mhn_tempfile_name (tempfile, type, subtype);
- obstack_grow (&stk, *tempfile, strlen (*tempfile));
+ mu_opool_appendz (pool, *tempfile);
break;
case 'l':
@@ -889,25 +888,25 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
case 's':
/* subtype */
- obstack_grow (&stk, subtype, strlen (subtype));
+ mu_opool_appendz (pool, subtype);
break;
case 'd':
/* content description */
if (mu_header_sget_value (hdr, MU_HEADER_CONTENT_DESCRIPTION,
&tmp) == 0)
- obstack_grow (&stk, tmp, strlen (tmp));
+ mu_opool_appendz (pool, tmp);
break;
default:
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
p++;
}
}
else
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
}
- obstack_1grow (&stk, 0);
+ mu_opool_append_char (pool, 0);
free (typestr);
free (type);
@@ -915,14 +914,14 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
free (temp_cmd);
mu_argcv_free (typeargc, typeargv);
- str = obstack_finish (&stk);
+ str = mu_opool_finish (pool, NULL);
p = mu_str_skip_class (str, MU_CTYPE_SPACE);
if (!*p)
str = NULL;
else
str = mu_strdup (p);
- obstack_free (&stk, NULL);
+ mu_opool_destroy (&pool);
return (char*) str;
}
@@ -941,7 +940,7 @@ mhn_store_command (mu_message_t msg, msg_part_t part, const char *name,
{
const char *p, *str, *tmp;
char *typestr, *type, *subtype, *typeargs;
- struct obstack stk;
+ mu_opool_t pool;
mu_header_t hdr;
enum store_destination dest;
@@ -998,7 +997,8 @@ mhn_store_command (mu_message_t msg, msg_part_t part, const char *name,
%p part
%s subtype */
- obstack_init (&stk);
+ mu_opool_create (&pool, 1);
+
for (p = str; *p; p++)
{
if (*p == '%')
@@ -1007,62 +1007,62 @@ mhn_store_command (mu_message_t msg, msg_part_t part, const char *name,
{
case 'a':
/* additional arguments */
- obstack_grow (&stk, typeargs, strlen (typeargs));
+ mu_opool_appendz (pool, typeargs);
break;
case 'm':
if (name)
- obstack_grow (&stk, name, strlen (name));
+ mu_opool_appendz (pool, name);
else
{
const char *buf = mu_umaxtostr (0, msg_part_subpart (part, 0));
- obstack_grow (&stk, buf, strlen (buf));
+ mu_opool_appendz (pool, buf);
}
break;
case 'P':
if (msg_part_level (part) >= 1)
- obstack_1grow (&stk, '.');
+ mu_opool_append_char (pool, '.');
/*FALLTHRU*/
case 'p':
if (msg_part_level (part) >= 1)
- msg_part_format_stk (&stk, part);
+ msg_part_format_pool (pool, part);
break;
case 's':
/* subtype */
- obstack_grow (&stk, subtype, strlen (subtype));
+ mu_opool_appendz (pool, subtype);
break;
case 'd':
/* content description */
if (mu_header_sget_value (hdr, MU_HEADER_CONTENT_DESCRIPTION,
&tmp) == 0)
- obstack_grow (&stk, tmp, strlen (tmp));
+ mu_opool_appendz (pool, tmp);
break;
default:
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
p++;
}
}
else
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
}
- obstack_1grow (&stk, *p);
+ mu_opool_append_char (pool, *p);
free (typestr);
free (type);
free (subtype);
- str = obstack_finish (&stk);
+ str = mu_opool_finish (pool, NULL);
p = mu_str_skip_class (str, MU_CTYPE_SPACE);
if (!*p)
*return_string = NULL;
else
*return_string = mu_strdup (p);
- obstack_free (&stk, NULL);
+ mu_opool_destroy (&pool);
return dest;
}
@@ -1932,7 +1932,7 @@ parse_brace (char **pval, char **cmd, int c, struct compose_env *env)
int
parse_content_type (struct compose_env *env,
- struct obstack *stk, char **prest, char **id, char **descr)
+ mu_opool_t pool, char **prest, char **id, char **descr)
{
int status = 0, stop = 0;
char *rest = *prest;
@@ -1990,12 +1990,12 @@ parse_content_type (struct compose_env *env,
break;
case ';':
- obstack_1grow (stk, ';');
- obstack_1grow (stk, ' ');
+ mu_opool_append_char (pool, ';');
+ mu_opool_append_char (pool, ' ');
skipws (rest);
sp = rest;
for (; *rest && !mu_isspace (*rest) && *rest != '='; rest++)
- obstack_1grow (stk, *rest);
+ mu_opool_append_char (pool, *rest);
skipws (rest);
if (*rest != '=')
{
@@ -2006,13 +2006,13 @@ parse_content_type (struct compose_env *env,
break;
}
rest++;
- obstack_1grow (stk, '=');
+ mu_opool_append_char (pool, '=');
skipws (rest);
for (; *rest; rest++)
{
if (isdelim (*rest))
break;
- obstack_1grow (stk, *rest);
+ mu_opool_append_char (pool, *rest);
}
break;
@@ -2025,9 +2025,9 @@ parse_content_type (struct compose_env *env,
if (comment)
{
- obstack_grow (stk, " (", 2);
- obstack_grow (stk, comment, strlen (comment));
- obstack_1grow (stk, ')');
+ mu_opool_append (pool, " (", 2);
+ mu_opool_appendz (pool, comment);
+ mu_opool_append_char (pool, ')');
free (comment);
}
*prest = rest;
@@ -2048,7 +2048,7 @@ parse_type_command (char **pcmd, struct compose_env *env, mu_header_t hdr)
char *type = NULL;
char *subtype = NULL;
char *descr = NULL, *id = NULL;
- struct obstack stk;
+ mu_opool_t pool;
char *rest = *pcmd;
skipws (rest);
@@ -2068,15 +2068,17 @@ parse_type_command (char **pcmd, struct compose_env *env, mu_header_t hdr)
return 1;
}
- obstack_init (&stk);
- obstack_grow (&stk, type, strlen (type));
- obstack_1grow (&stk, '/');
- obstack_grow (&stk, subtype, strlen (subtype));
- status = parse_content_type (env, &stk, &rest, &id, &descr);
- obstack_1grow (&stk, 0);
+ mu_opool_create (&pool, 1);
+
+ mu_opool_appendz (pool, type);
+ mu_opool_append_char (pool, '/');
+ mu_opool_appendz (pool, subtype);
+ status = parse_content_type (env, pool, &rest, &id, &descr);
+ mu_opool_append_char (pool, 0);
- mu_header_set_value (hdr, MU_HEADER_CONTENT_TYPE, obstack_finish (&stk), 1);
- obstack_free (&stk, NULL);
+ mu_header_set_value (hdr, MU_HEADER_CONTENT_TYPE,
+ mu_opool_finish (pool, NULL), 1);
+ mu_opool_destroy (&pool);
if (!id)
id = mh_create_message_id (env->subpart);
@@ -2217,7 +2219,7 @@ edit_extern (char *cmd, struct compose_env *env, mu_message_t *msg, int level)
mu_header_t hdr, hdr2;
mu_body_t body;
mu_stream_t in, out = NULL;
- struct obstack stk;
+ mu_opool_t pool;
if (!*msg)
mu_message_create (msg, NULL);
@@ -2234,13 +2236,14 @@ edit_extern (char *cmd, struct compose_env *env, mu_message_t *msg, int level)
mu_message_get_header (*msg, &hdr);
- obstack_init (&stk);
- obstack_grow (&stk, EXTCONTENT, sizeof (EXTCONTENT) - 1);
+ mu_opool_create (&pool, 1);
+ mu_opool_append (pool, EXTCONTENT, sizeof (EXTCONTENT) - 1);
*--rest = ';'; /* FIXME */
- rc = parse_content_type (env, &stk, &rest, &id, NULL);
- obstack_1grow (&stk, 0);
- mu_header_set_value (hdr, MU_HEADER_CONTENT_TYPE, obstack_finish (&stk), 1);
- obstack_free (&stk, NULL);
+ rc = parse_content_type (env, pool, &rest, &id, NULL);
+ mu_opool_append_char (pool, 0);