Commit 4e7f5b5c 4e7f5b5c08095818d7876a86ad6657c57c9a8ad1 by Sergey Poznyakoff

Fix logstream to support mu_locus_range.

* include/mailutils/locus.h (mu_stream_print_locus_range)
(mu_stream_vlprintf, mu_stream_lprintf, mu_lrange_debug): New protos.
* include/mailutils/stream.h (MU_IOCTL_LOGSTREAM_GET_LOCUS_RANGE)
(MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE): New ioctls.
* include/mailutils/sys/logstream.h (_mu_log_stream): Replace
locus with struct mu_locus_range locrange.
* libmailutils/locus/debug.c: Rewrite.
* libmailutils/locus/ident.c (mu_ident_ref): Accept NULL argument.
Fix initialization.
(mu_ident_deref): Accept NULL argument.
* libmailutils/stream/logstream.c: Rewrite.
* libmailutils/tests/.gitignore: Update.
* libmailutils/tests/Makefile.am: Add new tests.
* libmailutils/tests/testsuite.at: Likewise.
* libmailutils/tests/logstr.at: New testcase.
* libmailutils/tests/logstr.c: New file.
* libmailutils/tests/xscript.at: Minor change.
* sieve/tests/i-numeric.at: Minor change.
1 parent 7bca245a
......@@ -2,6 +2,7 @@
#define _MAILUTILS_LOCUS_H
#include <string.h>
#include <stdarg.h>
struct mu_locus_point
{
......@@ -49,6 +50,17 @@ void mu_locus_tracker_advance (struct mu_locus_track *trk,
char const *text, size_t leng);
void mu_locus_tracker_retreat (struct mu_locus_track *trk, size_t n);
void mu_stream_print_locus_range (mu_stream_t stream,
struct mu_locus_range const *loc);
void mu_stream_vlprintf (mu_stream_t stream,
struct mu_locus_range const *loc,
char const *fmt, va_list ap);
void mu_stream_lprintf (mu_stream_t stream,
struct mu_locus_range const *loc,
char const *fmt, ...);
void mu_lrange_debug (struct mu_locus_range const *loc,
char const *fmt, ...);
#endif
......
......@@ -36,6 +36,7 @@
#include <mailutils/header.h>
#include <mailutils/iterator.h>
#include <mailutils/kwd.h>
/* FIXME #include <mailutils/locus.h> */
#include <mailutils/sieve.h>
#include <mailutils/list.h>
#include <mailutils/locker.h>
......
......@@ -159,6 +159,15 @@ enum mu_buffer_type
*/
#define MU_IOCTL_LOGSTREAM_CLONE 14
/* Get locus range.
Arg: struct mu_locus_range *
*/
#define MU_IOCTL_LOGSTREAM_GET_LOCUS_RANGE 15
/* Set locus range.
Arg: struct mu_locus_range *
*/
#define MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE 16
/* Opcodes for MU_IOCTL_XSCRIPTSTREAM */
/* Swap transcript levels.
Arg: int *X
......
......@@ -19,6 +19,7 @@
#include <mailutils/types.h>
#include <mailutils/sys/stream.h>
#include <mailutils/locus.h>
struct _mu_log_stream
{
......@@ -30,7 +31,7 @@ struct _mu_log_stream
int logmode; /* Mode flags */
int sevmask; /* Mask out the output of severity level for
these severities. */
struct mu_locus locus; /* Location */
struct mu_locus_range locrange; /* Location in the source file */
};
void _mu_log_stream_setup (struct _mu_log_stream *sp, mu_stream_t transport);
......
......@@ -9,51 +9,93 @@
#include <mailutils/stdstream.h>
void
mu_lrange_debug (struct mu_locus_range const *loc,
char const *fmt, ...)
mu_stream_print_locus_range (mu_stream_t stream,
struct mu_locus_range const *loc)
{
va_list ap;
int rc, mode;
rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
MU_IOCTL_LOGSTREAM_GET_MODE, &mode);
if (rc == 0)
if (loc->beg.mu_col == 0)
{
int new_mode = mode & ~MU_LOGMODE_LOCUS;
rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
MU_IOCTL_LOGSTREAM_SET_MODE, &new_mode);
if (loc->end.mu_file
&& (!mu_locus_point_same_file (&loc->beg, &loc->end)
|| loc->beg.mu_line != loc->end.mu_line))
mu_stream_printf (stream, "%s:%u-%u",
loc->beg.mu_file,
loc->beg.mu_line,
loc->end.mu_line);
else
mu_stream_printf (stream, "%s:%u",
loc->beg.mu_file,
loc->beg.mu_line);
}
if (loc->beg.mu_col == 0)
mu_debug_log_begin ("%s:%u", loc->beg.mu_file, loc->beg.mu_line);
else if (!mu_locus_point_same_file (&loc->beg, &loc->end))
mu_debug_log_begin ("%s:%u.%u-%s:%u.%u",
else
{
if (loc->end.mu_file
&& !mu_locus_point_same_file (&loc->beg, &loc->end))
mu_stream_printf (stream, "%s:%u.%u-%s:%u.%u",
loc->beg.mu_file,
loc->beg.mu_line, loc->beg.mu_col,
loc->end.mu_file,
loc->end.mu_line, loc->end.mu_col);
else if (loc->beg.mu_line != loc->end.mu_line)
mu_debug_log_begin ("%s:%u.%u-%u.%u",
else if (loc->end.mu_file && loc->beg.mu_line != loc->end.mu_line)
mu_stream_printf (stream, "%s:%u.%u-%u.%u",
loc->beg.mu_file,
loc->beg.mu_line, loc->beg.mu_col,
loc->end.mu_line, loc->end.mu_col);
else if (loc->beg.mu_col != loc->end.mu_col)
mu_debug_log_begin ("%s:%u.%u-%u",
else if (loc->end.mu_file && loc->beg.mu_col != loc->end.mu_col)
mu_stream_printf (stream, "%s:%u.%u-%u",
loc->beg.mu_file,
loc->beg.mu_line, loc->beg.mu_col,
loc->end.mu_col);
else
mu_debug_log_begin ("%s:%u.%u",
mu_stream_printf (stream, "%s:%u.%u",
loc->beg.mu_file,
loc->beg.mu_line, loc->beg.mu_col);
}
}
void
mu_stream_vlprintf (mu_stream_t stream,
struct mu_locus_range const *loc,
char const *fmt, va_list ap)
{
mu_stream_print_locus_range (stream, loc);
mu_stream_write (stream, ": ", 2, NULL);
mu_stream_vprintf (mu_strerr, fmt, ap);
mu_stream_write (stream, "\n", 1, NULL);
}
mu_stream_write (mu_strerr, ": ", 2, NULL);
void
mu_stream_lprintf (mu_stream_t stream,
struct mu_locus_range const *loc,
char const *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
mu_stream_vlprintf (stream, loc, fmt, ap);
va_end (ap);
}
void
mu_lrange_debug (struct mu_locus_range const *loc,
char const *fmt, ...)
{
va_list ap;
int rc, mode;
rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
MU_IOCTL_LOGSTREAM_GET_MODE, &mode);
if (rc == 0)
{
int new_mode = mode & ~MU_LOGMODE_LOCUS;
rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
MU_IOCTL_LOGSTREAM_SET_MODE, &new_mode);
}
va_start (ap, fmt);
mu_stream_vprintf (mu_strerr, fmt, ap);
mu_stream_lprintf (mu_strerr, loc, fmt, ap);
va_end (ap);
mu_debug_log_nl ();
if (rc == 0)
mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
MU_IOCTL_LOGSTREAM_SET_MODE, &mode);
}
......
......@@ -20,10 +20,13 @@ mu_ident_ref (char const *name, char const **refname)
int rc;
struct mu_ident_ref *ref, **refptr;
if (!name)
return EINVAL;
if (!refname)
return MU_ERR_OUT_PTR_NULL;
if (!name)
{
*refname = NULL;
return 0;
}
if (!nametab)
{
......@@ -46,6 +49,7 @@ mu_ident_ref (char const *name, char const **refname)
mu_assoc_remove (nametab, name);
return rc;
}
*refptr = ref;
ref->count = 0;
break;
......@@ -68,9 +72,7 @@ mu_ident_deref (char const *name)
struct mu_ident_ref *ref;
int rc;
if (!name)
return EINVAL;
if (!nametab)
if (!name || !nametab)
return 0;
rc = mu_assoc_lookup (nametab, name, &ref);
......
......@@ -30,6 +30,7 @@
#include <mailutils/nls.h>
#include <mailutils/stream.h>
#include <mailutils/debug.h>
#include <mailutils/locus.h>
#include <mailutils/sys/logstream.h>
char *_mu_severity_str[] = {
......@@ -69,25 +70,77 @@ mu_severity_to_string (unsigned n, const char **pstr)
return 0;
}
static void
lr_set_line (struct mu_locus_range *loc, unsigned val, int end)
{
if (end)
loc->end.mu_line = val;
else
loc->beg.mu_line = val;
}
static void
lr_set_col (struct mu_locus_range *loc, unsigned val, int end)
{
if (end)
loc->end.mu_col = val;
else
loc->beg.mu_col = val;
}
static int
_locus_set_file (struct mu_locus *loc, const char *file, size_t len)
lr_set_file (struct mu_locus_range *loc, char const *fname, unsigned len,
int end)
{
free (loc->mu_file);
if (file)
char const *refname;
struct mu_locus_point *pt = end ? &loc->end : &loc->beg;
int rc;
if (fname == NULL)
{
loc->mu_file = malloc (len + 1);
if (!loc->mu_file)
return ENOMEM;
memcpy (loc->mu_file, file, len);
loc->mu_file[len] = 0;
refname = NULL;
rc = 0;
}
else if (len == 0)
rc = mu_ident_ref (fname, &refname);
else
loc->mu_file = NULL;
{
char *name;
name = malloc (len + 1);
if (!name)
return errno;
memcpy (name, fname, len);
name[len] = 0;
rc = mu_ident_ref (name, &refname);
free (name);
}
if (rc)
return rc;
mu_ident_deref (pt->mu_file);
pt->mu_file = refname;
return 0;
}
#define _locus_set_line(loc, line) ((loc)->mu_line = line)
#define _locus_set_col(loc, col) ((loc)->mu_col = col)
/* Field modification map (binary):
FfLlCc
The bits f, l, and c (file, line, and column) are toggled cyclically.
The value 0 means locus beg, 1 meand locus end.
The bits F, L, and C are set once and indicate that the corresponding
bit was toggled at least once.
*/
#define FMM_COL 0
#define FMM_LINE 1
#define FMM_FILE 2
#define FMM_SHIFT(n) ((n)<<1)
#define FMM_MASK(n) (0x3 << FMM_SHIFT (n))
#define FMM_VAL(m,n) (((m) >> FMM_SHIFT (n)) & 0x1)
#define FMM_SET(m,n,v) ((m) = ((m) & ~FMM_MASK (n)) | (((v) << FMM_SHIFT (n))|0x2))
#define FMM_CYCLE(m, n) \
FMM_SET ((m), (n), ((FMM_VAL ((m), (n)) + 1) % 2))
static int
_log_write (struct _mu_stream *str, const char *buf, size_t size,
......@@ -96,8 +149,8 @@ _log_write (struct _mu_stream *str, const char *buf, size_t size,
struct _mu_log_stream *sp = (struct _mu_log_stream *)str;
unsigned severity = sp->severity;
int logmode = sp->logmode;
struct mu_locus loc = sp->locus;
const char *fname = NULL;
struct mu_locus_range loc;
int fmm = 0;
unsigned flen = 0;
int save_locus = 0;
int rc;
......@@ -120,6 +173,10 @@ _log_write (struct _mu_stream *str, const char *buf, size_t size,
n = __x; \
} while (0)
loc = sp->locrange;
mu_ident_ref (loc.beg.mu_file, &loc.beg.mu_file);
mu_ident_ref (loc.end.mu_file, &loc.end.mu_file);
/* Tell them we've consumed everything */
*pnwrite = size;
......@@ -167,21 +224,24 @@ _log_write (struct _mu_stream *str, const char *buf, size_t size,
case 'l':
/* Input line (decimal) */
READNUM (n);
_locus_set_line (&loc, n);
lr_set_line (&loc, n, FMM_VAL (fmm, FMM_LINE));
FMM_CYCLE (fmm, FMM_LINE);
logmode |= MU_LOGMODE_LOCUS;
break;
case 'c':
/* Column in input line (decimal) */
READNUM (n);
_locus_set_col (&loc, n);
lr_set_col (&loc, n, FMM_VAL (fmm, FMM_COL));
FMM_CYCLE (fmm, FMM_COL);
logmode |= MU_LOGMODE_LOCUS;
break;
case 'f':
/* File name. Format: <N>S */
READNUM (flen);
fname = buf;
lr_set_file (&loc, buf, flen, FMM_VAL (fmm, FMM_FILE));
FMM_CYCLE (fmm, FMM_FILE);
buf += flen;
size -= flen;
logmode |= MU_LOGMODE_LOCUS;
......@@ -197,50 +257,28 @@ _log_write (struct _mu_stream *str, const char *buf, size_t size,
if (severity >= _mu_severity_num)
severity = MU_LOG_EMERG;
if (fname)
{
loc.mu_file = NULL;
_locus_set_file (&loc, fname, flen);
}
if (save_locus)
{
_locus_set_file (&sp->locus, loc.mu_file, strlen (loc.mu_file));
_locus_set_line (&sp->locus, loc.mu_line);
_locus_set_col (&sp->locus, loc.mu_col);
sp->locrange = loc;
mu_ident_ref (sp->locrange.beg.mu_file, &sp->locrange.beg.mu_file);
mu_ident_ref (sp->locrange.end.mu_file, &sp->locrange.end.mu_file);
}
if (severity < sp->threshold)
rc = 0;
else
{
if (fname)
free (loc.mu_file);
return 0;
}
mu_stream_ioctl (sp->transport, MU_IOCTL_LOGSTREAM,
MU_IOCTL_LOGSTREAM_SET_SEVERITY, &severity);
if (logmode & MU_LOGMODE_LOCUS)
{
if (loc.mu_file)
if ((logmode & MU_LOGMODE_LOCUS) && loc.beg.mu_file)
{
mu_stream_write (sp->transport, loc.mu_file,
strlen (loc.mu_file), NULL);
mu_stream_write (sp->transport, ":", 1, NULL);
if (loc.mu_line)
mu_stream_printf (sp->transport, "%u", loc.mu_line);
mu_stream_write (sp->transport, ":", 1, NULL);
if (loc.mu_col)
mu_stream_printf (sp->transport, "%u:", loc.mu_col);
mu_stream_write (sp->transport, " ", 1, NULL);
}
mu_stream_print_locus_range (sp->transport, &loc);
mu_stream_write (sp->transport, ": ", 2, NULL);
}
if (fname)
free (loc.mu_file);
if ((logmode & MU_LOGMODE_SEVERITY) &&
!(sp->sevmask & MU_DEBUG_LEVEL_MASK(severity)))
!(sp->sevmask & MU_DEBUG_LEVEL_MASK (severity)))
{
char *s = gettext (_mu_severity_str[severity]);
rc = mu_stream_write (sp->transport, s, strlen (s), NULL);
......@@ -248,7 +286,12 @@ _log_write (struct _mu_stream *str, const char *buf, size_t size,
return rc;
mu_stream_write (sp->transport, ": ", 2, NULL);
}
return mu_stream_write (sp->transport, buf, size, NULL);
rc = mu_stream_write (sp->transport, buf, size, NULL);
}
mu_ident_deref (loc.beg.mu_file);
mu_ident_deref (loc.end.mu_file);
return rc;
}
static int
......@@ -375,72 +418,133 @@ _log_ctl (struct _mu_stream *str, int code, int opcode, void *arg)
sp->logmode = *(int*)arg;
break;
case MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE:
{
struct mu_locus_range *lr = arg;
if (!arg)
{
mu_ident_deref (sp->locrange.beg.mu_file);
mu_ident_deref (sp->locrange.end.mu_file);
memset (&sp->locrange, 0, sizeof sp->locrange);
}
else
{
char const *begname, *endname;
status = mu_ident_ref (lr->beg.mu_file, &begname);
if (status)
return status;
status = mu_ident_ref (lr->end.mu_file, &endname);
if (status)
{
mu_ident_deref (begname);
return status;
}
mu_ident_deref (sp->locrange.beg.mu_file);
sp->locrange.beg.mu_file = begname;
sp->locrange.beg.mu_line = lr->beg.mu_line;
sp->locrange.beg.mu_col = lr->beg.mu_col;
mu_ident_deref (sp->locrange.end.mu_file);
sp->locrange.end.mu_file = endname;
sp->locrange.end.mu_line = lr->end.mu_line;
sp->locrange.end.mu_col = lr->end.mu_col;
}
}
break;
case MU_IOCTL_LOGSTREAM_GET_LOCUS_RANGE:
if (!arg)
return EINVAL;
else
{
struct mu_locus_range *lr = arg;
char const *begname, *endname;
status = mu_ident_ref (sp->locrange.beg.mu_file, &begname);
if (status)
return status;
status = mu_ident_ref (sp->locrange.end.mu_file, &endname);
if (status)
{
mu_ident_deref (begname);
return status;
}
lr->beg.mu_file = begname;
lr->beg.mu_line = sp->locrange.beg.mu_line;
lr->beg.mu_col = sp->locrange.beg.mu_col;
lr->end.mu_file = endname;
lr->end.mu_line = sp->locrange.end.mu_line;
lr->end.mu_col = sp->locrange.end.mu_col;
}
break;
case MU_IOCTL_LOGSTREAM_GET_LOCUS:
if (!arg)
return EINVAL;
else
{
struct mu_locus *ploc = arg;
if (sp->locus.mu_file)
if (sp->locrange.beg.mu_file)
{
ploc->mu_file = strdup (sp->locus.mu_file);
ploc->mu_file = strdup (sp->locrange.beg.mu_file);
if (!ploc->mu_file)
return ENOMEM;
}
else
ploc->mu_file = NULL;
ploc->mu_line = sp->locus.mu_line;
ploc->mu_col = sp->locus.mu_col;
ploc->mu_line = sp->locrange.beg.mu_line;
ploc->mu_col = sp->locrange.beg.mu_col;
}
break;
case MU_IOCTL_LOGSTREAM_SET_LOCUS:
{
struct mu_locus *ploc = arg;
if (!arg)
mu_ident_deref (sp->locrange.end.mu_file);
sp->locrange.end.mu_file = NULL;
if (arg)
{
free (sp->locus.mu_file);
sp->locus.mu_file = NULL;
sp->locus.mu_line = 0;
sp->locus.mu_col = 0;
status = lr_set_file (&sp->locrange, ploc->mu_file, 0, 0);
if (status)
return status;
lr_set_line (&sp->locrange, ploc->mu_line, 0);
lr_set_col (&sp->locrange, ploc->mu_col, 0);
}
else
{
if (ploc->mu_file)
_locus_set_file (&sp->locus, ploc->mu_file,
strlen (ploc->mu_file));
if (ploc->mu_line)
_locus_set_line (&sp->locus, ploc->mu_line);
if (ploc->mu_col)
_locus_set_col (&sp->locus, ploc->mu_col);
mu_ident_deref (sp->locrange.beg.mu_file);
sp->locrange.beg.mu_file = NULL;
}
break;
}
case MU_IOCTL_LOGSTREAM_SET_LOCUS_LINE:
if (!arg)
return EINVAL;
sp->locus.mu_line = *(unsigned*)arg;
sp->locrange.beg.mu_line = *(unsigned*)arg;
break;
case MU_IOCTL_LOGSTREAM_SET_LOCUS_COL:
if (!arg)
return EINVAL;
sp->locus.mu_col = *(unsigned*)arg;
sp->locrange.beg.mu_col = *(unsigned*)arg;
break;
case MU_IOCTL_LOGSTREAM_ADVANCE_LOCUS_LINE:
if (!arg)
sp->locus.mu_line++;
sp->locrange.beg.mu_line++;
else
sp->locus.mu_line += *(int*)arg;
sp->locrange.beg.mu_line += *(int*)arg;
break;
case MU_IOCTL_LOGSTREAM_ADVANCE_LOCUS_COL:
if (!arg)
sp->locus.mu_col++;
sp->locrange.beg.mu_col++;
else
sp->locus.mu_col += *(int*)arg;
sp->locrange.beg.mu_col += *(int*)arg;
break;
case MU_IOCTL_LOGSTREAM_SUPPRESS_SEVERITY:
......@@ -484,14 +588,12 @@ _log_ctl (struct _mu_stream *str, int code, int opcode, void *arg)
newp->threshold = sp->threshold;
newp->logmode = sp->logmode;
newp->sevmask = sp->sevmask;
if (sp->locus.mu_file)
{
newp->locus.mu_file = strdup (sp->locus.mu_file);
if (!newp->locus.mu_file)
return ENOMEM;
}
newp->locus.mu_line = sp->locus.mu_line;
newp->locus.mu_col = sp->locus.mu_col;
newp->locrange = sp->locrange;
mu_ident_ref (sp->locrange.beg.mu_file,
&sp->locrange.beg.mu_file);
mu_ident_ref (sp->locrange.end.mu_file,
&sp->locrange.end.mu_file);
*(mu_stream_t*) arg = str;
}
break;
......
......@@ -19,6 +19,7 @@ fsfolder
globtest
imapio
listop
logstr
mailcap
mimehdr
modmesg
......
......@@ -54,6 +54,7 @@ noinst_PROGRAMS = \
globtest\
imapio\
listop\
logstr\
mailcap\
mimehdr\
modtofsaf\
......@@ -106,6 +107,7 @@ TESTSUITE_AT = \
inline-comment.at\
linecon.at\
list.at\
logstr.at\
mailcap.at\
mimehdr.at\
modmesg00.at\
......
# This file is part of GNU Mailutils. -*- Autotest -*-
# Copyright (C) 2017 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/>.
AT_SETUP(Logger stream)
AT_KEYWORDS([logstream])
AT_CHECK([logstr],
[0],
[00. simple print
hello world
01. severity
info: one
emerg: two
mode was: 0x0001
02. suppress severity
info: this message is seen
emerg: and this one as well
03. suppress severity name
info: this message is seen
emerg: and this one as well
04. severity mask
one
two
emerg: three
05. set/get locus point
input:1: filename and line number
input:1.3: filename, line and column numbers
06. locus: file, line
input:1: file, line
07. locus: file, line, col
input:1.1-10: file, line, col
08. locus: file, line-range
input:1-2: file, line-range
09. locus: file, line-range, col
input:1.1-2.10: file, line-range, col
10. locus: file-range, line-range, col-range
input:1.1-next:2.10: file-range, line-range, col-range
11. set locus line
input:1.1-next:2.10: initial
input:8.1-next:2.10: locus line changed
12. advance locus line
input:1.1-next:5.10: initial
input:3.1-next:5.10: locus line advanced
13. set locus column
input:1.1-next:2.10: initial
input:1.8-next:2.10: locus column changed
14. advance locus column
input:1.1-next:5.10: initial
input:1.5-next:5.10: locus line advanced
15. fmt: severity
info: severity
16. fmt: locus (file, line)
a:10: one
17. fmt: locus (file, line, column)
a:10.5: one
18. fmt: locus (range)
a:10.5-b:14.8: one
19. fmt: locus; restore defaults
a:10.5-b:14.8: one
default
20. fmt: locus; restore defaults, display locus
a:10.5-b:14.8: one
input:1.1-next:5.10: default
21. fmt: set locus
a:10.5-b:14.8: one
a:10.5-b:14.8: default
])
AT_CLEANUP
\ No newline at end of file
......@@ -152,6 +152,10 @@ m4_include([strin.at])
m4_include([strout.at])
m4_include([strerr.at])
AT_BANNER([Streams])
m4_include([logstr.at])
m4_include([xscript.at])
m4_include([list.at])
m4_include([address.at])
m4_include([wordsplit.at])
......@@ -208,4 +212,3 @@ m4_include([msgset.at])
m4_include([globtest.at])
m4_include([xscript.at])
......
......@@ -14,7 +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/>.
AT_BANNER([Transcript stream])
AT_SETUP([Transcript stream])
AT_KEYWORDS([stream xscript])
AT_DATA([input],[first line
......
......@@ -38,7 +38,7 @@ if header :comparator "i;ascii-numeric" :contains "X-Number" "15"
discard;
}
],[78],[],
[sieve: prog:4:1: comparator `i;ascii-numeric' is incompatible with match type `contains' in call to `header'
[sieve: prog:4.1: comparator `i;ascii-numeric' is incompatible with match type `contains' in call to `header'
])
AT_CLEANUP
......
atconfig
atlocal
bs
cwdrepl
fldel
lstuid
package.m4
......