From e28d2d3e3b620a5d82cc641e70219b7c8594b9b5 Mon Sep 17 00:00:00 2001 From: djcb Date: Tue, 25 Oct 2011 08:42:57 +0300 Subject: [PATCH] * add '(:found )' --- src/mu-cmd-server.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/mu-cmd-server.c b/src/mu-cmd-server.c index e5d46f3e..89403f51 100644 --- a/src/mu-cmd-server.c +++ b/src/mu-cmd-server.c @@ -78,11 +78,6 @@ install_sig_handler (void) sigs[i], strerror (errno));; } -/* we include \376 (0xfe) and \377, (0xff) because it cannot occur as - * part of the other output, as 0xfe, 0xff are not valid UTF-8 - */ -/* #define BOX ";;box\376\n" /\* just before the sexp starts *\/ */ -/* #define EOX ";;eox\377\n" /\* after the sexp has ended *\/ */ #define BOX "\376" @@ -109,11 +104,33 @@ send_expr (const char* frm, ...) if (rv < 0) MU_WRITE_LOG ("error writing output: %s", strerror(errno)); + { + MU_WRITE_LOG ("--\n%s\n--", hdr); + } + + g_free (hdr); va_end (ap); } +/* ugly, ugly... emacs reads/processes the data from the server in + * up-to 4096 byte blobs (see read_process_output in the emacs source + * code), and for longer messages / more headers, it may only start + * processing (showing) the message after more data comes, instead of + * immediately. As a work-around for this, here, we just send some + * 'filler data' as to 'flush the pipe', so to speak. hopefully, one + * day I can come up with a more elegant way to do this...*/ +static void +send_filler_data (unsigned len) +{ + unsigned u; + const char* filler = ";; \n"; + for (u = 0; u != len/8; ++u) + write (fileno(stdout), filler, strlen (filler)); +} + + static MuError server_error (GError **err, MuError merr, const char* frm, ...) G_GNUC_PRINTF(3, 4); @@ -310,6 +327,8 @@ cmd_info (MuStore *store, GSList *lst, GError **err) } + + static MuError cmd_find (MuStore *store, MuQuery *query, GSList *lst, GError **err) { @@ -344,8 +363,10 @@ cmd_find (MuStore *store, MuQuery *query, GSList *lst, GError **err) mu_msg_iter_destroy (iter); - if (u == 0) - return server_error (NULL, MU_ERROR_NO_MATCHES, "No matches"); + /* return the number of results found */ + send_expr ("(:found %u)", u); + + send_filler_data (2048); return MU_OK; } @@ -697,12 +718,8 @@ cmd_view (MuStore *store, GSList *args, GError **err) * here, we just send some 'filler data' as to 'flush the * pipe', so to speak. hopefully, one day I can come up with a * more elegant way to do this...*/ - if (strlen (sexp) > 4000) { - int i; - const char* filler = ";; \n"; - for (i = 0; i != 8; ++i) - write (fileno(stdout), filler, strlen (filler)); - } + if (strlen (sexp) > 4000) + send_filler_data (256); g_free (sexp);