notmuch/test/hex-xcode.c
Jani Nikula 0f314c0c99 cli: convert notmuch_bool_t to stdbool
C99 stdbool turned 18 this year. There really is no reason to use our
own, except in the library interface for backward
compatibility. Convert the cli and test binaries to stdbool.
2017-10-09 22:24:02 -03:00

109 lines
2 KiB
C

/* No, nothing to to with IDE from Apple Inc.
* testbed for ../util/hex-escape.c.
*
* usage:
* hex-xcode [--direction=(encode|decode)] [--omit-newline] < file
* hex-xcode [--direction=(encode|decode)] [--omit-newline] [--in-place] arg1 arg2 arg3 ...
*
*/
#include "notmuch-client.h"
#include "hex-escape.h"
#include <assert.h>
enum direction {
ENCODE,
DECODE
};
static bool inplace = false;
static int
xcode (void *ctx, enum direction dir, char *in, char **buf_p, size_t *size_p)
{
hex_status_t status;
if (dir == ENCODE)
status = hex_encode (ctx, in, buf_p, size_p);
else
if (inplace) {
status = hex_decode_inplace (in);
*buf_p = in;
*size_p = strlen(in);
} else {
status = hex_decode (ctx, in, buf_p, size_p);
}
if (status == HEX_SUCCESS)
fputs (*buf_p, stdout);
return status;
}
int
main (int argc, char **argv)
{
int dir = DECODE;
bool omit_newline = false;
notmuch_opt_desc_t options[] = {
{ .opt_keyword = &dir, .name = "direction", .keywords =
(notmuch_keyword_t []){ { "encode", ENCODE },
{ "decode", DECODE },
{ 0, 0 } } },
{ .opt_bool = &omit_newline, .name = "omit-newline" },
{ .opt_bool = &inplace, .name = "in-place" },
{ }
};
int opt_index = parse_arguments (argc, argv, options, 1);
if (opt_index < 0)
exit (1);
void *ctx = talloc_new (NULL);
char *line = NULL;
size_t line_size;
ssize_t line_len;
char *buffer = NULL;
size_t buf_size = 0;
bool read_stdin = true;
for (; opt_index < argc; opt_index++) {
if (xcode (ctx, dir, argv[opt_index],
&buffer, &buf_size) != HEX_SUCCESS)
return 1;
if (! omit_newline)
putchar ('\n');
read_stdin = false;
}
if (! read_stdin)
return 0;
while ((line_len = getline (&line, &line_size, stdin)) != -1) {
chomp_newline (line);
if (xcode (ctx, dir, line, &buffer, &buf_size) != HEX_SUCCESS)
return 1;
if (! omit_newline)
putchar ('\n');
}
if (line)
free (line);
talloc_free (ctx);
return 0;
}