diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2017-06-18 13:12:11 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2017-06-18 13:48:57 +0300 |
commit | 93a4e6d8020655f719c3f6ef8e9b36926cca010e (patch) | |
tree | 71f096a8c7510ff34b9268b6ad9a2446256ae3a8 | |
parent | 7892e5bacca59d994918be4999ad0af3a8bbf33b (diff) | |
download | mailutils-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.h | 2 | ||||
-rw-r--r-- | libmailutils/locus/linetrack.c | 11 | ||||
-rw-r--r-- | libmailutils/tests/linetrack.at | 17 | ||||
-rw-r--r-- | libmailutils/tests/linetrack.c | 14 |
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 }, |