summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-06-12 17:53:04 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-06-12 17:53:04 +0300
commit16383a0184fd266e33c7d16ef55ce0d39dd1206e (patch)
tree43ebce60153a59a4a4940f5a57160a1a74836d6d
parent44ae83d0d7776b365cee4cdc7f1d61e19513c951 (diff)
downloadmailutils-16383a0184fd266e33c7d16ef55ce0d39dd1206e.tar.gz
mailutils-16383a0184fd266e33c7d16ef55ce0d39dd1206e.tar.bz2
Improve linetrack interface
* include/mailutils/locus.h (mu_linetrack_rebase): New proto. * libmailutils/locus/linetrack.c (mu_linetrack_rebase): New function. * libmailutils/diag/diag.c (mu_diag_at_locus_range): New function.
-rw-r--r--include/mailutils/locus.h1
-rw-r--r--libmailutils/diag/diag.c32
-rw-r--r--libmailutils/locus/linetrack.c46
3 files changed, 66 insertions, 13 deletions
diff --git a/include/mailutils/locus.h b/include/mailutils/locus.h
index bbe5be3c8..50efc53fb 100644
--- a/include/mailutils/locus.h
+++ b/include/mailutils/locus.h
@@ -65,6 +65,7 @@ void mu_lrange_debug (struct mu_locus_range const *loc,
int mu_linetrack_create (mu_linetrack_t *ret,
char const *file_name, size_t max_lines);
+int mu_linetrack_rebase (mu_linetrack_t trk, struct mu_locus_point const *pt);
void mu_linetrack_free (mu_linetrack_t trk);
void mu_linetrack_destroy (mu_linetrack_t *trk);
void mu_linetrack_advance (mu_linetrack_t trk,
diff --git a/libmailutils/diag/diag.c b/libmailutils/diag/diag.c
index 318afe0a4..185101bb7 100644
--- a/libmailutils/diag/diag.c
+++ b/libmailutils/diag/diag.c
@@ -29,6 +29,7 @@
#include <mailutils/errno.h>
#include <mailutils/stdstream.h>
#include <mailutils/stream.h>
+#include <mailutils/locus.h>
void
mu_diag_init ()
@@ -71,6 +72,37 @@ mu_diag_at_locus (int level, struct mu_locus const *loc, const char *fmt, ...)
}
void
+mu_diag_at_locus_range (int level, struct mu_locus_range const *loc,
+ const char *fmt, ...)
+{
+ va_list ap;
+ struct mu_locus_range old = MU_LOCUS_RANGE_INITIALIZER;
+ int restore = 0;
+
+ if (loc)
+ {
+ if (mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
+ MU_IOCTL_LOGSTREAM_GET_LOCUS_RANGE, &old) == 0)
+ {
+ mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
+ MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE, (void*) loc);
+ restore = 1;
+ }
+ }
+
+ va_start (ap, fmt);
+ mu_diag_voutput (level, fmt, ap);
+ va_end (ap);
+
+ if (restore)
+ {
+ mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM,
+ MU_IOCTL_LOGSTREAM_SET_LOCUS_RANGE, &old);
+ mu_locus_range_deinit (&old);
+ }
+}
+
+void
mu_diag_vprintf (int level, const char *fmt, va_list ap)
{
mu_diag_init ();
diff --git a/libmailutils/locus/linetrack.c b/libmailutils/locus/linetrack.c
index 8f200ed4d..07030d966 100644
--- a/libmailutils/locus/linetrack.c
+++ b/libmailutils/locus/linetrack.c
@@ -28,9 +28,27 @@ struct mu_linetrack
cols[head + n] (0 <= n <= tos). */
};
+static inline unsigned *
+cols_ptr (mu_linetrack_t trk, size_t n)
+{
+ return &trk->cols[(trk->head + n) % trk->max_lines];
+}
+
+static inline unsigned *
+cols_tos_ptr (mu_linetrack_t trk)
+{
+ return cols_ptr (trk, trk->tos);
+}
+
+static inline unsigned
+cols_peek (mu_linetrack_t trk, size_t n)
+{
+ return *cols_ptr (trk, n);
+}
+
int
mu_linetrack_create (mu_linetrack_t *ret,
- char const *file_name, size_t max_lines)
+ char const *file_name, size_t max_lines)
{
int rc;
struct mu_linetrack *trk;
@@ -65,6 +83,20 @@ mu_linetrack_create (mu_linetrack_t *ret,
return 0;
}
+int
+mu_linetrack_rebase (mu_linetrack_t trk, struct mu_locus_point const *pt)
+{
+ char const *file_name;
+ int rc = mu_ident_ref (pt->mu_file, &file_name);
+ if (rc)
+ return rc;
+ mu_ident_deref (trk->file_name);
+ trk->file_name = file_name;
+ trk->hline = pt->mu_line;
+ *cols_ptr (trk, 0) = pt->mu_col;
+ return 0;
+}
+
void
mu_linetrack_free (mu_linetrack_t trk)
{
@@ -87,18 +119,6 @@ mu_linetrack_destroy (mu_linetrack_t *trk)
}
static inline unsigned *
-cols_tos_ptr (mu_linetrack_t trk)
-{
- return &trk->cols[(trk->head + trk->tos) % trk->max_lines];
-}
-
-static inline unsigned
-cols_peek (mu_linetrack_t trk, size_t n)
-{
- return trk->cols[(trk->head + n) % trk->max_lines];
-}
-
-static inline unsigned *
push (mu_linetrack_t trk)
{
unsigned *ptr;

Return to:

Send suggestions and report system problems to the System administrator.