Commit 44f87939 44f87939efa0a33e8d1f26b9d9fa3e15c32d808a by Sergey Poznyakoff

Remove libmu_compat

1 parent 3733cba7
......@@ -94,7 +94,6 @@ SUBDIRS = . \
sql\
libmu_auth\
libproto\
libmu_compat\
testsuite\
lib\
$(LIBMU_CPP_DIR)\
......
......@@ -1318,7 +1318,6 @@ test -z "$client_list" && client_list=" [NONE]"
# Initialize the (autotest) test suite.
AC_CONFIG_TESTDIR(libmailutils/tests)
AC_CONFIG_TESTDIR(testsuite)
AC_CONFIG_TESTDIR(libmu_compat/tests)
AC_CONFIG_TESTDIR(frm/tests)
AC_CONFIG_TESTDIR(maidag/tests)
AC_CONFIG_TESTDIR(mail/tests)
......@@ -1331,8 +1330,6 @@ AC_CONFIG_TESTDIR(imap4d/tests)
AC_CONFIG_FILES([libmailutils/tests/Makefile
libmailutils/tests/atlocal
libmu_compat/tests/Makefile
libmu_compat/tests/atlocal
testsuite/Makefile
testsuite/atlocal
comsat/tests/Makefile
......@@ -1487,7 +1484,6 @@ AC_CONFIG_FILES([
libproto/nntp/Makefile
libproto/imap/Makefile
libproto/imap/tests/Makefile
libmu_compat/Makefile
maidag/Makefile
mail/Makefile
mail/testsuite/Makefile
......
......@@ -28,7 +28,6 @@ pkginclude_HEADERS = \
acl.h\
address.h\
alloc.h\
argcv.h\
assoc.h\
attribute.h\
auth.h\
......@@ -102,7 +101,6 @@ pkginclude_HEADERS = \
tls.h\
types.h\
url.h\
vartab.h\
version.h\
wordsplit.h
......
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999-2001, 2005, 2007, 2010-2012, 2014-2016 Free
Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _ARGCV_H
#define _ARGCV_H 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mailutils/types.h>
#ifdef __cplusplus
extern "C" {
#endif
void mu_argcv_free (size_t argc, char **argv);
void mu_argv_free (char **argv);
enum mu_argcv_escape
{
mu_argcv_escape_no,
mu_argcv_escape_c
/* mu_argcv_escape_sh */
};
int mu_argcv_join (int argc, char **argv, char *delim,
enum mu_argcv_escape esc,
char **pstring);
void mu_argcv_remove (int *pargc, char ***pargv,
int (*sel) (const char *, void *), void *);
int mu_argcv_string (int argc, char **argv, char **string);
/* Deprecated interfaces */
#define MU_ARGCV_RETURN_DELIMS 0x01
#ifndef MU_ARCGV_DEPRECATED
# define MU_ARCGV_DEPRECATED MU_DEPRECATED
#endif
int mu_argcv_get (const char *command, const char *delim,
const char *cmnt,
int *argc, char ***argv) MU_ARCGV_DEPRECATED;
int mu_argcv_get_n (const char *command, int len,
const char *delim, const char *cmnt,
int *argc, char ***argv) MU_ARCGV_DEPRECATED;
int mu_argcv_get_np (const char *command, int len,
const char *delim, const char *cmnt,
int flags,
int *pargc, char ***pargv, char **endp)
MU_ARCGV_DEPRECATED;
int mu_argcv_unquote_char (int c) MU_ARCGV_DEPRECATED;
int mu_argcv_quote_char (int c) MU_ARCGV_DEPRECATED;
size_t mu_argcv_quoted_length (const char *str, int *quote)
MU_ARCGV_DEPRECATED;
void mu_argcv_unquote_copy (char *dst, const char *src, size_t n)
MU_ARCGV_DEPRECATED;
void mu_argcv_quote_copy (char *dst, const char *src)
MU_ARCGV_DEPRECATED;
#ifdef __cplusplus
}
#endif
#endif /* _ARGCV_H */
......@@ -134,13 +134,6 @@ enum mu_iconv_fallback_mode
mu_fallback_copy_octal
};
extern int mu_filter_iconv_create (mu_stream_t *s, mu_stream_t transport,
const char *fromcode, const char *tocode,
int flags,
enum mu_iconv_fallback_mode fallback_mode)
MU_DEPRECATED;
extern int mu_linelen_filter_create (mu_stream_t *pstream, mu_stream_t stream,
size_t limit, int flags);
......
......@@ -154,8 +154,6 @@ int mu_list_foreach_dir (mu_list_t _list, int _dir, mu_list_action_t _action,
void *_cbdata);
/* Same as mu_list_foreach_dir with _dir==0. */
int mu_list_foreach (mu_list_t _list, mu_list_action_t _action, void *_data);
/* A historical alias to the above. */
int mu_list_do (mu_list_t, mu_list_action_t, void *) MU_DEPRECATED;
/* ************************************************* */
......
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2007, 2010-2012, 2014-2016 Free Software Foundation,
Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library; If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _MAILUTILS_VARTAB_H
#define _MAILUTILS_VARTAB_H
#include <mailutils/types.h>
#ifdef MU_SUPPRESS_DEPRECATION
# undef MU_DEPRECATED
# define MU_DEPRECATED
#else
# warning "Mailutils support for vartab functions has been deprecated."
# warning "Revise your code to use <mailutils/wordsplit.h>."
#endif
typedef int (*mu_var_expansion_fp) (const char *name, void *data, char **p);
typedef void (*mu_var_free_fp) (void *data, char *value);
int mu_vartab_create (mu_vartab_t *pvar) MU_DEPRECATED;
int mu_vartab_destroy (mu_vartab_t *pvar) MU_DEPRECATED;
int mu_vartab_define (mu_vartab_t var, const char *name, const char *value,
int isstatic) MU_DEPRECATED;
int mu_vartab_define_exp (mu_vartab_t var, const char *name,
mu_var_expansion_fp fun, mu_var_free_fp free,
void *data) MU_DEPRECATED;
int mu_vartab_count (mu_vartab_t vt, size_t *pcount) MU_DEPRECATED;
int mu_vartab_getvar (mu_vartab_t vt, const char *name, const char **pvalue)
MU_DEPRECATED;
int mu_vartab_expand (mu_vartab_t vt, const char *str, char **pres)
MU_DEPRECATED;
#endif
......@@ -45,11 +45,3 @@ mu_list_foreach (mu_list_t list, mu_list_action_t action, void *cbdata)
mu_iterator_destroy (&itr);
return status;
}
/* Retained for compatibility with previous versions.
In the future it will be removed, or changed to a define or weak alias. */
int
mu_list_do (mu_list_t list, mu_list_action_t action, void *cbdata)
{
return mu_list_foreach (list, action, cbdata);
}
......
# This file is part of GNU Mailutils
# Copyright (C) 2010-2012, 2014-2016 Free Software Foundation, Inc.
#
# GNU Mailutils is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or (at
# your option) any later version.
#
# GNU Mailutils 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 GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
SUBDIRS = . tests
lib_LTLIBRARIES = libmu_compat.la
libmu_compat_la_SOURCES = \
argcv.c\
filter_iconv.c\
vartab.c
AM_CPPFLAGS = @MU_LIB_COMMON_INCLUDES@ -I/libmailutils
/* argcv.c - simple functions for parsing input based on whitespace
Copyright (C) 1999-2001, 2003-2006, 2010-2012, 2014-2016 Free
Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
<http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <ctype.h>
#include <errno.h>
#define MU_ARCGV_DEPRECATED
#include <mailutils/argcv.h>
/* Keep mailutils namespace clean */
#define argcv_get mu_argcv_get
#define argcv_get_n mu_argcv_get_n
#define argcv_get_np mu_argcv_get_np
#define argcv_unquote_char mu_argcv_unquote_char
#define argcv_quote_char mu_argcv_quote_char
#define argcv_quoted_length mu_argcv_quoted_length
#define argcv_unquote_copy mu_argcv_unquote_copy
#define argcv_quote_copy mu_argcv_quote_copy
/*
* takes a string and splits it into several strings, breaking at ' '
* command is the string to split
* the number of strings is placed into argc
* the split strings are put into argv
* returns 0 on success, nonzero on failure
*/
#define isws(c) ((c)==' '||(c)=='\t'||(c)=='\n')
#define isdelim(c,delim) (strchr(delim,(c))!=NULL)
struct argcv_info
{
int len;
const char *command;
const char *delim;
const char *comment;
int flags;
int start;
int end;
int save;
int finish_pos;
};
static void
init_argcv_info (struct argcv_info *ap, int flags,
int len, const char *command, const char *delim,
const char *comment)
{
memset (ap, 0, sizeof *ap);
ap->len = len;
ap->command = command;
ap->delim = delim;
ap->comment = comment;
ap->flags = flags;
}
static int
argcv_scan (struct argcv_info *ap)
{
int i = 0;
int len = ap->len;
const char *command = ap->command;
const char *delim = ap->delim;
const char *comment = ap->comment;
for (;;)
{
i = ap->save;
if (i >= len)
return i + 1;
/* Skip initial whitespace */
while (i < len && isws (command[i]))
i++;
ap->start = i;
if (!isdelim (command[i], delim))
{
while (i < len)
{
if (command[i] == '\\')
{
if (++i == len)
break;
i++;
continue;
}
if (command[i] == '\'' || command[i] == '"')
{
int j;
for (j = i + 1; j < len && command[j] != command[i]; j++)
if (command[j] == '\\')
j++;
if (j < len)
i = j + 1;
else
i++;
}
else if (isws (command[i]) || isdelim (command[i], delim))
break;
else
i++; /* skip the escaped character */
}
i--;
}
else if (!(ap->flags & MU_ARGCV_RETURN_DELIMS))
{
while (i < len && isdelim (command[i], delim))
i++;
ap->save = i;
continue;
}
ap->end = i;
ap->save = ap->finish_pos = i + 1;
/* If we have a token, and it starts with a comment character, skip
to the newline and restart the token search. */
if (ap->save <= len)
{
if (strchr (comment, command[ap->start]) != NULL)
{
ap->finish_pos = ap->start;
i = ap->save;
while (i < len && command[i] != '\n')
i++;
ap->save = i;
continue;
}
}
break;
}
return ap->save;
}
static char quote_transtab[] = "\\\\\"\"a\ab\bf\fn\nr\rt\tv\v";
int
argcv_unquote_char (int c)
{
char *p;
for (p = quote_transtab; *p; p += 2)
{
if (*p == c)
return p[1];
}
return c;
}
int
argcv_quote_char (int c)
{
char *p;
for (p = quote_transtab + sizeof(quote_transtab) - 2;
p > quote_transtab; p -= 2)
{
if (*p == c)
return p[-1];
}
return -1;
}
#define to_num(c) \
(isdigit(c) ? c - '0' : (isxdigit(c) ? toupper(c) - 'A' + 10 : 255 ))
static int
xtonum (int *pval, const char *src, int base, int cnt)
{
int i, val;
for (i = 0, val = 0; i < cnt; i++, src++)
{
int n = *(unsigned char*)src;
if (n > 127 || (n = to_num(n)) >= base)
break;
val = val*base + n;
}
*pval = val;
return i;
}
size_t
argcv_quoted_length (const char *str, int *quote)
{
size_t len = 0;
*quote = 0;
for (; *str; str++)
{
if (*str == ' ')
{
len++;
*quote = 1;
}
else if (*str == '"')
{
len += 2;
*quote = 1;
}
else if (*str != '\t' && *str != '\\' && isprint (*str))
len++;
else if (argcv_quote_char (*str) != -1)
len += 2;
else
len += 4;
}
return len;
}
void
argcv_unquote_copy (char *dst, const char *src, size_t n)
{
int i = 0;
int c;
int expect_delim = 0;
while (i < n)
{
switch (src[i])
{
case '\'':
case '"':
if (!expect_delim)
{
const char *p;
for (p = src+i+1; *p && *p != src[i]; p++)
if (*p == '\\')
p++;
if (*p)
expect_delim = src[i++];
else
*dst++ = src[i++];
}
else if (expect_delim == src[i])
++i;
else
*dst++ = src[i++];
break;
case '\\':
++i;
if (src[i] == 'x' || src[i] == 'X')
{
if (n - i < 2)
{
*dst++ = '\\';
*dst++ = src[i++];
}
else
{
int off = xtonum(&c, src + i + 1, 16, 2);
if (off == 0)
{
*dst++ = '\\';
*dst++ = src[i++];
}
else
{
*dst++ = c;
i += off + 1;
}
}
}
else if ((unsigned char)src[i] < 128 && isdigit (src[i]))
{
if (n - i < 1)
{
*dst++ = '\\';
*dst++ = src[i++];
}
else
{
int off = xtonum (&c, src+i, 8, 3);
if (off == 0)
{
*dst++ = '\\';
*dst++ = src[i++];
}
else
{
*dst++ = c;
i += off;
}
}
}
else
*dst++ = argcv_unquote_char (src[i++]);
break;
default:
*dst++ = src[i++];
}
}
*dst = 0;
}
void
argcv_quote_copy (char *dst, const char *src)
{
for (; *src; src++)
{
if (*src == '"')
{
*dst++ = '\\';
*dst++ = *src;
}
else if (*src != '\t' && *src != '\\' && isprint(*src))
*dst++ = *src;
else
{
int c = argcv_quote_char (*src);
*dst++ = '\\';
if (c != -1)
*dst++ = c;
else
{
char tmp[4];
snprintf (tmp, sizeof tmp, "%03o", *(unsigned char*)src);
memcpy (dst, tmp, 3);
dst += 3;
}
}
}
}
int
argcv_get_np (const char *command, int len,
const char *delim, const char *cmnt,
int flags,
int *pargc, char ***pargv, char **endp)
{
int i = 0;
struct argcv_info info;
int argc;
char **argv;
if (!delim)
delim = "";
if (!cmnt)
cmnt = "";
init_argcv_info (&info, flags, len, command, delim, cmnt);
/* Count number of arguments */
argc = 0;
while (argcv_scan (&info) <= len)
argc++;
argv = calloc ((argc + 1), sizeof (char *));
if (argv == NULL)
return ENOMEM;
i = 0;
info.save = 0;
for (i = 0; i < argc; i++)
{
int n;
int unquote;
argcv_scan (&info);
if ((command[info.start] == '"' || command[info.end] == '\'')
&& command[info.end] == command[info.start])
{
if (info.start < info.end)
{
info.start++;
info.end--;
}
unquote = 0;
}
else
unquote = 1;
n = info.end - info.start + 1;
argv[i] = calloc (n + 1, sizeof (char));
if (argv[i] == NULL)
{
mu_argcv_free (i, argv);
return ENOMEM;
}
if (unquote)
argcv_unquote_copy (argv[i], &command[info.start], n);
else
memcpy (argv[i], &command[info.start], n);
argv[i][n] = 0;
}
argv[i] = NULL;
*pargc = argc;
*pargv = argv;
if (endp)
*endp = (char*) (command + info.finish_pos);
return 0;
}
int
argcv_get_n (const char *command, int len, const char *delim, const char *cmnt,
int *pargc, char ***pargv)
{
return argcv_get_np (command, len, delim, cmnt, MU_ARGCV_RETURN_DELIMS,
pargc, pargv, NULL);
}
int
argcv_get (const char *command, const char *delim, const char *cmnt,
int *argc, char ***argv)
{
return argcv_get_n (command, strlen (command), delim, cmnt, argc, argv);
}
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2010-2012, 2014-2016 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
<http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdlib.h>
#include <mailutils/types.h>
#include <mailutils/stream.h>
#include <mailutils/filter.h>
int
mu_filter_iconv_create (mu_stream_t *s, mu_stream_t transport,
const char *fromcode, const char *tocode, int flags,
enum mu_iconv_fallback_mode fallback_mode)
{
const char *argv[] = { "iconv", fromcode, tocode, NULL, NULL };
switch (fallback_mode)
{
case mu_fallback_none:
argv[3] = "none";
break;
case mu_fallback_copy_pass:
argv[3] = "copy-pass";
break;
case mu_fallback_copy_octal:
argv[3] = "copy-octal";
}
return mu_filter_create_args (s, transport, "iconv", 4, argv,
MU_FILTER_DECODE, MU_FILTER_READ);
}
atconfig
atlocal
package.m4
testsuite
testsuite.dir
testsuite.log
argcv
# This file is part of GNU Mailutils.
# Copyright (C) 2010-2012, 2014-2016 Free Software Foundation, Inc.
#
# GNU Mailutils is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or (at
# your option) any later version.
#
# GNU Mailutils 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 GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4
DISTCLEANFILES = atconfig $(check_SCRIPTS)
MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE)
## ------------ ##
## package.m4. ##
## ------------ ##
$(srcdir)/package.m4: $(top_srcdir)/configure.ac
$(AM_V_GEN){ \
echo '# Signature of the current package.'; \
echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \
echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \
echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \
echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \
echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \
} >$(srcdir)/package.m4
#
## -------------------------- ##
## Non-installable programs
## -------------------------- ##
AM_CPPFLAGS = @MU_LIB_COMMON_INCLUDES@
noinst_PROGRAMS = argcv
LDADD = ../libmu_compat.la ${MU_LIB_MAILUTILS}
## ------------ ##
## Test suite. ##
## ------------ ##
TESTSUITE_AT = \
argcv.at\
testsuite.at
TESTSUITE = $(srcdir)/testsuite
M4=m4
AUTOTEST = $(AUTOM4TE) --language=autotest
$(TESTSUITE): package.m4 $(TESTSUITE_AT) $(top_srcdir)/testsuite/testsuite.inc
$(AM_V_GEN)$(AUTOTEST) -I $(srcdir) -I $(top_srcdir)/testsuite testsuite.at -o $@.tmp
$(AM_V_at)mv $@.tmp $@
atconfig: $(top_builddir)/config.status
cd $(top_builddir) && ./config.status tests/$@
clean-local:
@test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean
check-local: atconfig atlocal $(TESTSUITE)
@$(SHELL) $(TESTSUITE)
# Run the test suite on the *installed* tree.
#installcheck-local:
# $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin
# This file is part of GNU Mailutils. -*- Autotest -*-
# Copyright (C) 2007-2012, 2014-2016 Free Software Foundation, Inc.
#
# GNU Mailutils is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or (at
# your option) any later version.
#
# GNU Mailutils 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 GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
dnl ------------------------------------------------------------
dnl TESTARGS([NAME], [KW = `'], [INPUT], [STDOUT = `'],
dnl [STDERR = `'], [RUN-IF-FAIL], [RUN-IF-PASS])
dnl
m4_pushdef([TESTARGS],[
m4_pushdef([MU_TEST_GROUP],[Argcv])
m4_pushdef([MU_TEST_KEYWORDS],[argcv])
m4_pushdef([MU_TEST_COMMAND],[argcv])
AT_SETUP([Argcv: m4_if([$1],[],mu_firstline([$3]),[$1])])
AT_KEYWORDS([argcv $2])
AT_CHECK([
AT_DATA([input],[$3
])
argcv < input],[0],[$4],[$5],[$6],[$7])
AT_CLEANUP
])
dnl ------------------------------------------------------------
TESTARGS([simple input],[],
[1 2 3],
[3: 1 2 3
])
TESTARGS([quoted space],[],
[quoted\ space],
[1: "quoted space"
])
TESTARGS([tab character],[],
[a "tab character"],
[2: a tab\tcharacter
])
TESTARGS([octal and hex escapes],[],
[\157\143\164\141\154\40and\x20\x68\x65\x78],
[1: "octal and hex"
])
TESTARGS([octal and hex escapes 2],[],
[\157\143\164\141\154\40 and \x20\x68\x65\x78],
[3: "octal " and " hex"
])
TESTARGS([escape representation],[],
[A\x3-\48\39],
[1: A\003-\0048\0039
])
TESTARG([8-bit input],[],
[×ÅÒÈÎÑÑ ÐÏÌÏ×ÉÎÁ ÔÁÂÌÉÃÙ],
[3: \327\305\322\310\316\321\321 \320\317\314\317\327\311\316\301 \324\301\302\314\311\303\331])
TESTARG([misquoted input],[],
[messed up'quotations ' in "a single'" "command" lin"e],
[6: messed "upquotations " in "a single'" command "lin\"e"
])
TESTARG([unbalanced quote],[],
['unbalanced "quote],
[2: 'unbalanced "\"quote"
])
TESTARG([unbalanced quote 2],[],
[unbalanced "quote],
[2: unbalanced "\"quote"
])
TESTARG([unbalanced quote 3],[],
["],
[1: "\""
])
m4_popdef([TESTARGS])
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2005, 2007, 2009-2012, 2014-2016 Free Software
Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Mailutils 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 GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#define MU_ARCGV_DEPRECATED
#include <mailutils/argcv.h>
#include <mailutils/errno.h>
int
main (int argc, char **argv)
{
char *delim = "";
char *comment = "#";
char buf[512];
while (fgets (buf, sizeof buf, stdin))
{
int status, c;
char **v;
char *s;
status = mu_argcv_get (buf, delim, comment, &c, &v);
if (status)
{
fprintf (stderr, "cannot parse: %s\n", mu_strerror (status));
continue;
}
status = mu_argcv_string (c, v, &s);
if (status)
fprintf (stderr, "cannot create string: %s\n", mu_strerror (status));
else
{
printf ("%d: %s\n", c, s);
free (s);
}
mu_argcv_free (c, v);
}
exit (0);
}
# @configure_input@ -*- shell-script -*-
# Configurable variable values for Mailutils test suite.
# Copyright (C) 2004, 2010-2012, 2014-2016 Free Software Foundation,
# Inc.
PATH=@abs_builddir@:@abs_top_builddir@/libmailutils/tests:$top_srcdir:$srcdir:$PATH
# This file is part of GNU Mailutils. -*- Autotest -*-
# Copyright (C) 2007-2012, 2014-2016 Free Software Foundation, Inc.
#
# GNU Mailutils is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or (at
# your option) any later version.
#
# GNU Mailutils 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 GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
m4_include([testsuite.inc])
AT_INIT
m4_include([argcv.at])
/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2007, 2010-2012, 2014-2016 Free Software Foundation,
Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library; If not, see
<http://www.gnu.org/licenses/>. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <mailutils/assoc.h>
#include <mailutils/stream.h>
#include <mailutils/errno.h>
#include <mailutils/iterator.h>
#define MU_SUPPRESS_DEPRECATION
#include <mailutils/vartab.h>
struct _mu_vartab
{
mu_assoc_t assoc;
mu_stream_t stream;
char *buf;
size_t bufsize;
};
#define MU_VARDEFN_STATIC 0x1
#define MU_VARDEFN_FUNC 0x2
struct vardefn
{
int flags;
char *value;
mu_var_expansion_fp fun;
mu_var_free_fp free;
void *data;
};
int
mu_vartab_create (mu_vartab_t *pvar)
{
int rc;
struct _mu_vartab *p = calloc (1, sizeof *p);
if (!p)
return ENOMEM;
rc = mu_assoc_create (&p->assoc, sizeof (struct vardefn), 0);
if (rc)
{
free (p);
return rc;
}
*pvar = p;
return 0;
}
static void
vardefn_free (struct vardefn *vd)
{
if (vd->value)
{
if (vd->free)
vd->free (vd->data, vd->value);
else if (!(vd->flags & MU_VARDEFN_STATIC))
free (vd->value);
}
memset (vd, 0, sizeof *vd);
}
int
mu_vartab_destroy (mu_vartab_t *pvar)
{
int rc;
mu_vartab_t var = *pvar;
mu_iterator_t itr;
if (!var)
return EINVAL;
rc = mu_assoc_get_iterator (var->assoc, &itr);
if (rc)
return rc;
for (mu_iterator_first (itr); !mu_iterator_is_done (itr);
mu_iterator_next (itr))
{
struct vardefn *vd;
mu_iterator_current (itr, (void**)&vd);
vardefn_free (vd);
}
mu_iterator_destroy (&itr);
mu_assoc_destroy (&var->assoc);
mu_stream_destroy (&var->stream);
free (var->buf);
free (var);
*pvar = NULL;
return 0;
}
int
mu_vartab_define (mu_vartab_t var, const char *name, const char *value,
int isstatic)
{
int rc;
struct vardefn *vd;
if (!var)
return EINVAL;
rc = mu_assoc_ref_install (var->assoc, name, (void **) &vd);
if (rc == MU_ERR_EXISTS)
vardefn_free (vd);
else if (rc != 0)
return rc;
if (isstatic)
{
vd->flags = MU_VARDEFN_STATIC;
vd->value = (char*) value;
}
else
{
vd->flags = 0;
vd->value = strdup (value);
if (!vd->value)
return ENOMEM;
}
return 0;
}
int
mu_vartab_define_exp (mu_vartab_t var, const char *name,
mu_var_expansion_fp fun, mu_var_free_fp free,
void *data)
{
int rc;
struct vardefn *vd;
if (!var)
return EINVAL;
rc = mu_assoc_ref_install (var->assoc, name, (void **) &vd);
if (rc == MU_ERR_EXISTS)
vardefn_free (vd);
else if (rc != 0)
return rc;
vd->flags = MU_VARDEFN_FUNC;
vd->fun = fun;
vd->free = free;
vd->data = data;
return 0;
}
int
mu_vartab_count (mu_vartab_t vt, size_t *pcount)
{
if (!vt)
return EINVAL;
return mu_assoc_count (vt->assoc, pcount);
}
static int
vardefn_expand (const char *name, struct vardefn *vd, const char **pvalue)
{
if (!vd->value)
{
if (vd->fun)
{
int rc = vd->fun (name, vd->data, &vd->value);
if (rc)
return rc;
}
else
return EINVAL;
}
*pvalue = vd->value;
return 0;
}
int
mu_vartab_getvar (mu_vartab_t vt, const char *name, const char **pvalue)
{
struct vardefn *vdefn;
if (!vt)
return EINVAL;
vdefn = mu_assoc_ref (vt->assoc, name);
if (!vdefn)
return MU_ERR_NOENT;
return vardefn_expand (name, vdefn, pvalue);
}
static char *
copy_name (mu_vartab_t vt, const char *name, size_t len)
{
if (len + 1 > vt->bufsize)
{
char *p = realloc (vt->buf, len + 1);
if (!p)
return NULL;
vt->buf = p;
vt->bufsize = len + 1;
}
memcpy (vt->buf, name, len);
vt->buf[len] = 0;
return vt->buf;
}
int
mu_vartab_expand (mu_vartab_t vt, const char *str, char **pres)
{
int rc;
mu_off_t size;
const char *p;
if (!vt)
return EINVAL;
if (!vt->stream)
{
rc = mu_memory_stream_create (&vt->stream, 0);
if (rc)
return rc;
}
else
mu_stream_truncate (vt->stream, 0);
mu_stream_seek (vt->stream, 0, MU_SEEK_SET, NULL);
for (p = str; *p; )
{
if (*p == '$')
{
switch (*++p)
{
case '$':
mu_stream_write (vt->stream, str, p - str, NULL);
str = p + 1;
p = str + 1;
break;
case '{':
{
const char *e = strchr (p + 1, '}');
if (e)
{
const char *pvalue;
size_t len = e - p - 1;
char *name = copy_name (vt, p + 1, len);
rc = mu_vartab_getvar (vt, name, &pvalue);
if (rc == 0)
{
mu_stream_write (vt->stream, str, p - str - 1, NULL);
mu_stream_write (vt->stream, pvalue, strlen (pvalue),
NULL);
str = e + 1;
p = str + 1;
}
else if (rc == MU_ERR_NOENT)
p = e + 1;
else
return rc;
}
else
p++;
}
break;
default:
{
char *name = copy_name (vt, p, 1);
const char *pvalue;
rc = mu_vartab_getvar (vt, name, &pvalue);
if (rc == 0)
{
mu_stream_write (vt->stream, str, p - str - 1, NULL);
mu_stream_write (vt->stream, pvalue, strlen (pvalue),
NULL);
str = p + 1;
p = str + 1;
}
else if (rc == MU_ERR_NOENT)
p++;
else
return rc;
}
break;
}
}
else if (*p == '%')
{
/* allow `%' as prefix for single-character entities, for
compatibility with v. prior to 1.2.91 */
if (*++p == '%')
{
mu_stream_write (vt->stream, str, p - str, NULL);
str = p + 1;
p = str + 1;
}
else
{
char *name = copy_name (vt, p, 1);
const char *pvalue;
rc = mu_vartab_getvar (vt, name, &pvalue);
if (rc == 0)
{
mu_stream_write (vt->stream, str, p - str - 1, NULL);
mu_stream_write (vt->stream, pvalue, strlen (pvalue),
NULL);
str = p + 1;
p = str + 1;
}
else if (rc == MU_ERR_NOENT)
p++;
else
return rc;
}
}
else
p++;
}
if (p > str)
mu_stream_write (vt->stream, str, p - str, NULL);
mu_stream_size (vt->stream, &size);
*pres = malloc (size + 1);
if (!*pres)
return ENOMEM;
mu_stream_seek (vt->stream, 0, MU_SEEK_SET, NULL);
mu_stream_read (vt->stream, *pres, size, NULL);
(*pres)[size] = 0;
return 0;
}
......@@ -411,7 +411,7 @@ run_metamail (const char *mailcap_cmd, mu_message_t mesg)
status = mu_message_get_streamref (mesg, &stream);
if (status)
{
mu_error ("mu_message_get_stream: %s", mu_strerror (status));
mu_error ("mu_message_get_streamref: %s", mu_strerror (status));
break;
}
......
......@@ -57,7 +57,6 @@ struct lib_descr {
#endif
{ "mailer", "-lmu_mailer", 0 },
{ "sieve", "-lmu_sieve", 0, NOTALL },
{ "compat", "-lmu_compat", 0 },
{ "auth", "-lmu_auth " AUTHLIBS, 2 },
#ifdef WITH_GUILE
{ "guile", "-lmu_scm " GUILE_LIBS, -1, NOTALL },
......@@ -65,6 +64,7 @@ struct lib_descr {
#ifdef WITH_PYTHON
{ "python", "-lmu_py " PYTHON_LIBS, -1, NOTALL },
#endif
{ "compat", NULL, 0, 0 }, /* deprecated */
{ "cfg", NULL, 0, 0 }, /* deprecated */
{ "argp", NULL, 0, 0 }, /* deprecated */
{ NULL }
......