summaryrefslogtreecommitdiff
path: root/sexp-format.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2003-02-10 17:26:01 +0100
committerNiels Möller <nisse@lysator.liu.se>2003-02-10 17:26:01 +0100
commite01516ec4686430168045b058984e39adc58c4a6 (patch)
tree9e88079b6c83ea69e5c686118b19cede6edec357 /sexp-format.c
parent790e9669d6d2f7b0f202be8299671a200bbb621f (diff)
downloadnettle-e01516ec4686430168045b058984e39adc58c4a6.tar.gz
(format_string): New function.
(sexp_vformat): Implemented support for literals in the format string. Rev: src/nettle/sexp-format.c:1.6 Rev: src/nettle/sexp.h:1.12
Diffstat (limited to 'sexp-format.c')
-rw-r--r--sexp-format.c58
1 files changed, 35 insertions, 23 deletions
diff --git a/sexp-format.c b/sexp-format.c
index 5c98f7a7..6fdc8910 100644
--- a/sexp-format.c
+++ b/sexp-format.c
@@ -71,6 +71,20 @@ format_prefix(struct nettle_buffer *buffer,
return prefix_length + 1;
}
+static unsigned
+format_string(struct nettle_buffer *buffer,
+ unsigned length, const uint8_t *s)
+{
+ unsigned prefix_length = format_prefix(buffer, length);
+ if (!prefix_length)
+ return 0;
+
+ if (buffer && !nettle_buffer_write(buffer, length, s))
+ return 0;
+
+ return prefix_length + length;
+}
+
unsigned
sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
{
@@ -81,8 +95,18 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
switch (*format++)
{
default:
- abort();
-
+ {
+ const char *start = format - 1;
+ unsigned length = 1 + strcspn(format, "()%");
+ unsigned output_length = format_string(buffer, length, start);
+ if (!output_length)
+ return 0;
+
+ done += output_length;
+ format = start + length;
+
+ break;
+ }
case '\0':
assert(!nesting);
@@ -123,7 +147,7 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
{
const char *s;
unsigned length;
- unsigned prefix_length;
+ unsigned output_length;
if (nul_flag)
{
@@ -136,25 +160,18 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
s = va_arg(args, const char *);
}
- prefix_length = format_prefix(buffer, length);
-
- if (!prefix_length)
+ output_length = format_string(buffer, length, s);
+ if (!output_length)
return 0;
- done += prefix_length;
-
- if (buffer && !nettle_buffer_write(buffer, length, s))
- return 0;
-
- done += length;
-
+ done += output_length;
break;
}
case 't':
{
const char *s;
unsigned length;
- unsigned prefix_length;
+ unsigned output_length;
if (nul_flag)
{
@@ -176,18 +193,13 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
return 0;
done++;
- prefix_length = format_prefix(buffer, length);
+ output_length = format_string(buffer, length, s);
- if (!prefix_length)
+ if (!output_length)
return 0;
- done += prefix_length;
-
- if (buffer && !nettle_buffer_write(buffer, length, s))
- return 0;
-
- done += length;
-
+ done += output_length;
+
if (buffer && !NETTLE_BUFFER_PUTC(buffer, ']'))
return 0;
done++;