summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2017-06-18 13:12:11 +0300
committerSergey Poznyakoff <gray@gnu.org>2017-06-18 13:48:57 +0300
commit93a4e6d8020655f719c3f6ef8e9b36926cca010e (patch)
tree71f096a8c7510ff34b9268b6ad9a2446256ae3a8
parent7892e5bacca59d994918be4999ad0af3a8bbf33b (diff)
downloadmailutils-93a4e6d8020655f719c3f6ef8e9b36926cca010e.tar.gz
mailutils-93a4e6d8020655f719c3f6ef8e9b36926cca010e.tar.bz2
linetrack: handle #line directives without file name.
* include/mailutils/diag.h (mu_vdiag_at_locus_range): New proto. * libmailutils/locus/linetrack.c (mu_linetrack_origin): accept locus point with mu_file==NULL. Reuse current file name in this case. This is to simplify handling of #line directives without file name. * libmailutils/tests/linetrack.c: Implement #line directive. * libmailutils/tests/linetrack.at: Add new test.
-rw-r--r--include/mailutils/diag.h2
-rw-r--r--libmailutils/locus/linetrack.c11
-rw-r--r--libmailutils/tests/linetrack.at17
-rw-r--r--libmailutils/tests/linetrack.c14
4 files changed, 41 insertions, 3 deletions
diff --git a/include/mailutils/diag.h b/include/mailutils/diag.h
index 03a0eacc2..c03add3c1 100644
--- a/include/mailutils/diag.h
+++ b/include/mailutils/diag.h
@@ -52,6 +52,8 @@ void mu_diag_cont_printf (const char *fmt, ...) MU_PRINTFLIKE(1,2);
void mu_diag_voutput (int, const char *, va_list);
void mu_diag_output (int, const char *, ...) MU_PRINTFLIKE(2,3);
+void mu_vdiag_at_locus_range (int level, struct mu_locus_range const *loc,
+ const char *fmt, va_list ap);
void mu_diag_at_locus_point (int level, struct mu_locus_point const *loc,
const char *fmt, ...);
void mu_diag_at_locus_range (int level, struct mu_locus_range const *loc,
diff --git a/libmailutils/locus/linetrack.c b/libmailutils/locus/linetrack.c
index a9f289835..02768f065 100644
--- a/libmailutils/locus/linetrack.c
+++ b/libmailutils/locus/linetrack.c
@@ -163,13 +163,20 @@ mu_linetrack_origin (mu_linetrack_t trk, struct mu_locus_point const *pt)
{
int rc;
struct source *sp;
+ char const *file_name;
- if (!trk || !pt || !pt->mu_file || pt->mu_line == 0)
+ if (!trk || !pt || pt->mu_line == 0)
+ return EINVAL;
+ if (pt->mu_file)
+ file_name = pt->mu_file;
+ else if (trk->s_head)
+ file_name = trk->s_head->file_name;
+ else
return EINVAL;
sp = malloc (sizeof *sp);
if (!sp)
return errno;
- rc = mu_ident_ref (pt->mu_file, &sp->file_name);
+ rc = mu_ident_ref (file_name, &sp->file_name);
if (rc)
{
free (sp);
diff --git a/libmailutils/tests/linetrack.at b/libmailutils/tests/linetrack.at
index 21d714413..8836605a5 100644
--- a/libmailutils/tests/linetrack.at
+++ b/libmailutils/tests/linetrack.at
@@ -18,7 +18,7 @@ AT_BANNER([Line tracker])
m4_pushdef([TRACKTEST],[
AT_SETUP([$1])
-AT_KEYWORDS([tracker $2])
+AT_KEYWORDS([tracker linetrack $2])
AT_CHECK([linetrack liber $3 <<EOT
$4[]EOT
],
@@ -275,5 +275,20 @@ two
archivum:5.4-6: two
])
+TRACKTEST([#line directive],[],[9],
+[agnosco
+veteris\n
+vestigia
+#line 20
+flamme\n
+#retreat 8
+Naso
+],
+[liber:1.1-7: agnosco
+liber:1.8-14: veteris\n
+liber:2.1-8: vestigia
+liber:20.1-6: flamme\n
+liber:2.8-11: Naso
+])
m4_popdef([TRACKTEST])
diff --git a/libmailutils/tests/linetrack.c b/libmailutils/tests/linetrack.c
index 1dc0c875d..48240265f 100644
--- a/libmailutils/tests/linetrack.c
+++ b/libmailutils/tests/linetrack.c
@@ -46,6 +46,19 @@ com_origin (mu_linetrack_t trk, size_t argc, char **argv)
}
static void
+com_line (mu_linetrack_t trk, size_t argc, char **argv)
+{
+ int rc;
+ struct mu_locus_point pt = MU_LOCUS_POINT_INITIALIZER;
+
+ if (getnum (argv[1], &pt.mu_line))
+ return;
+ rc = mu_linetrack_origin (trk, &pt);
+ if (rc)
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_linetrack_origin", NULL, rc);
+}
+
+static void
com_rebase (mu_linetrack_t trk, size_t argc, char **argv)
{
int rc;
@@ -110,6 +123,7 @@ struct command
static struct command comtab[] = {
{ "retreat", 2, com_retreat },
{ "origin", 4, com_origin },
+ { "line", 2, com_line },
{ "point", 1, com_point },
{ "rebase", 4, com_rebase },
{ "bol", 1, com_bol_p },

Return to:

Send suggestions and report system problems to the System administrator.