From 1c8a719246e5f64ae9ea3152c699610c6f25f20c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Fri, 25 Oct 2002 17:17:04 +0200 Subject: [PATCH] (struct sexp_output): Added coding attribute. (sexp_put_char): Use output->coding. (sexp_put_base64_start): Likewise. (sexp_put_base64_end): Likewise. Rev: src/nettle/examples/sexp-conv.c:1.7 --- examples/sexp-conv.c | 57 +++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/examples/sexp-conv.c b/examples/sexp-conv.c index e1f89ad2..21d120c2 100644 --- a/examples/sexp-conv.c +++ b/examples/sexp-conv.c @@ -92,6 +92,7 @@ struct sexp_output { FILE *f; + enum sexp_coding coding; enum sexp_mode mode; struct base64_encode_ctx base64; @@ -102,6 +103,7 @@ static void sexp_output_init(struct sexp_output *output, FILE *f, enum sexp_mode mode) { output->f = f; + output->coding = SEXP_PLAIN; output->mode = mode; output->pos = 0; } @@ -492,34 +494,41 @@ static void sexp_put_char(struct sexp_output *output, unsigned indent, uint8_t c) { - if (output->mode & SEXP_TRANSPORT) + switch (output->coding) { - uint8_t encoded[2]; - unsigned done; - unsigned i; + case SEXP_BASE64: + { + uint8_t encoded[2]; + unsigned done; + unsigned i; - done = base64_encode_single(&output->base64, encoded, c); + done = base64_encode_single(&output->base64, encoded, c); - assert(done <= sizeof(encoded)); + assert(done <= sizeof(encoded)); - for (i = 0; i<done; i++) - { - if (indent && - output->pos > LINE_WIDTH - && output->pos > (indent + 10)) - sexp_put_newline(output, indent); + for (i = 0; i<done; i++) + { + if (indent && + output->pos > LINE_WIDTH + && output->pos > (indent + 10)) + sexp_put_newline(output, indent); - if (putc(encoded[i], output->f) < 0) - die("Write failed: %s\n", strerror(errno)); + if (putc(encoded[i], output->f) < 0) + die("Write failed: %s\n", strerror(errno)); - output->pos++; - } - } - else - { + output->pos++; + } + break; + } + case SEXP_PLAIN: output->pos++; if (putc(c, output->f) < 0) die("Write failed: %s\n", strerror(errno)); + break; + + case SEXP_HEX: + /* Not implemented */ + abort(); } } @@ -557,12 +566,12 @@ sexp_put_length(struct sexp_output *output, unsigned indent, static void sexp_put_base64_start(struct sexp_output *output, uint8_t c) { - assert(! (output->mode & SEXP_TRANSPORT)); + assert(output->coding == SEXP_PLAIN); sexp_put_char(output, 0, c); base64_encode_init(&output->base64); - output->mode |= SEXP_TRANSPORT; + output->coding = SEXP_BASE64; } static void @@ -571,13 +580,13 @@ sexp_put_base64_end(struct sexp_output *output, uint8_t c) uint8_t encoded[BASE64_ENCODE_FINAL_LENGTH]; unsigned done; - assert(output->mode & SEXP_TRANSPORT); + assert(output->coding = SEXP_BASE64); done = base64_encode_final(&output->base64, encoded); assert(done <= sizeof(encoded)); - output->mode &= ~ SEXP_TRANSPORT; + output->coding = SEXP_PLAIN; sexp_put_data(output, 0, done, encoded); sexp_put_char(output, 0, c); @@ -702,7 +711,7 @@ sexp_convert_item(struct sexp_input *input, enum sexp_mode mode, static void sexp_convert_list(struct sexp_input *input, enum sexp_mode mode, - struct sexp_output *output, + struct sexp_output *output, unsigned indent) { unsigned item; -- GitLab