summaryrefslogtreecommitdiff
path: root/test-line-buffer.c
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2011-01-02 21:05:46 -0600
committerJonathan Nieder <jrnieder@gmail.com>2011-02-26 04:59:37 -0600
commite832f43c1d26bf70611d98b62d95870a99292add (patch)
tree1b24a34f03268e1061ce6ee9c679c05b9912724b /test-line-buffer.c
parentd280f68313eecb8b3838c70641a246382d5e5343 (diff)
downloadgit-e832f43c1d26bf70611d98b62d95870a99292add.tar.gz
vcs-svn: add binary-safe read function
buffer_read_string works well for non line-oriented input except for one problem: it does not tell the caller how many bytes were actually written. This means that unless one is very careful about checking for errors (and eof) the calling program cannot tell the difference between the string "foo" followed by an early end of file and the string "foo\0bar\0baz". So introduce a variant that reports the length, too, a thinner wrapper around strbuf_fread. Its result is written to a strbuf so the caller does not need to keep track of the number of bytes read. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Diffstat (limited to 'test-line-buffer.c')
-rw-r--r--test-line-buffer.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/test-line-buffer.c b/test-line-buffer.c
index ec19b13ee2..19bf2d4403 100644
--- a/test-line-buffer.c
+++ b/test-line-buffer.c
@@ -3,6 +3,7 @@
*/
#include "git-compat-util.h"
+#include "strbuf.h"
#include "vcs-svn/line_buffer.h"
static uint32_t strtouint32(const char *s)
@@ -17,6 +18,15 @@ static uint32_t strtouint32(const char *s)
static void handle_command(const char *command, const char *arg, struct line_buffer *buf)
{
switch (*command) {
+ case 'b':
+ if (!prefixcmp(command, "binary ")) {
+ struct strbuf sb = STRBUF_INIT;
+ strbuf_addch(&sb, '>');
+ buffer_read_binary(buf, &sb, strtouint32(arg));
+ fwrite(sb.buf, 1, sb.len, stdout);
+ strbuf_release(&sb);
+ return;
+ }
case 'c':
if (!prefixcmp(command, "copy ")) {
buffer_copy_bytes(buf, strtouint32(arg));