summaryrefslogtreecommitdiff
path: root/sexp-format.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2002-12-04 10:42:31 +0100
committerNiels Möller <nisse@lysator.liu.se>2002-12-04 10:42:31 +0100
commit1c323788782c3a5d59153972e532cb079f14b120 (patch)
treea82637ba0a430b4d7b571d526f7eaa8bf5ab162f /sexp-format.c
parenta38808d68d3c61de44508f913a3d0daf366eb52c (diff)
downloadnettle-1c323788782c3a5d59153972e532cb079f14b120.tar.gz
(format_length_string): Deleted function.
(format_string): Deleted function. (sexp_vformat): New %t specifier, formatting an optional display type. Deleted %z specifier. Instead, introduced a new modifier "0" that can be used with %s, %l and %t, which says that the data is NUL-terminated. Rev: src/nettle/sexp-format.c:1.5 Rev: src/nettle/sexp.h:1.11
Diffstat (limited to 'sexp-format.c')
-rw-r--r--sexp-format.c304
1 files changed, 175 insertions, 129 deletions
diff --git a/sexp-format.c b/sexp-format.c
index 217ead31..5c98f7a7 100644
--- a/sexp-format.c
+++ b/sexp-format.c
@@ -71,27 +71,6 @@ format_prefix(struct nettle_buffer *buffer,
return prefix_length + 1;
}
-static unsigned
-format_length_string(struct nettle_buffer *buffer,
- unsigned length, const char *s)
-{
- unsigned done = format_prefix(buffer, length);
- if (!done)
- return 0;
-
- if (buffer && !nettle_buffer_write(buffer, length, s))
- return 0;
-
- return done + length;
-}
-
-static unsigned
-format_string(struct nettle_buffer *buffer,
- const char *s)
-{
- return format_length_string(buffer, strlen(s), s);
-}
-
unsigned
sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
{
@@ -127,133 +106,200 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
break;
case '%':
- switch (*format++)
- {
- default:
- abort();
-
- case 'z':
- {
- const char *s = va_arg(args, const char *);
- unsigned length = format_string(buffer, s);
-
- if (!length)
- return 0;
+ {
+ int nul_flag = 0;
- done += length;
- break;
+ if (*format == '0')
+ {
+ format++;
+ nul_flag = 1;
}
- case 's':
+ switch (*format++)
{
- unsigned length = va_arg(args, unsigned);
- const char *s = va_arg(args, const char *);
- unsigned prefix_length = format_prefix(buffer, length);
-
- if (!prefix_length)
- return 0;
+ default:
+ abort();
- done += prefix_length;
+ case 's':
+ {
+ const char *s;
+ unsigned length;
+ unsigned prefix_length;
+
+ if (nul_flag)
+ {
+ s = va_arg(args, const char *);
+ length = strlen(s);
+ }
+ else
+ {
+ length = va_arg(args, unsigned);
+ s = va_arg(args, const char *);
+ }
+
+ prefix_length = format_prefix(buffer, length);
+
+ if (!prefix_length)
+ return 0;
+
+ done += prefix_length;
+
+ if (buffer && !nettle_buffer_write(buffer, length, s))
+ return 0;
+
+ done += length;
+
+ break;
+ }
+ case 't':
+ {
+ const char *s;
+ unsigned length;
+ unsigned prefix_length;
+
+ if (nul_flag)
+ {
+ s = va_arg(args, const char *);
+ if (!s)
+ break;
+
+ length = strlen(s);
+ }
+ else
+ {
+ length = va_arg(args, unsigned);
+ s = va_arg(args, const char *);
+ if (!s)
+ break;
+ }
+
+ if (buffer && !NETTLE_BUFFER_PUTC(buffer, '['))
+ return 0;
+ done++;
+
+ prefix_length = format_prefix(buffer, length);
+
+ if (!prefix_length)
+ return 0;
- if (buffer && !nettle_buffer_write(buffer, length, s))
- return 0;
+ done += prefix_length;
- done += length;
+ if (buffer && !nettle_buffer_write(buffer, length, s))
+ return 0;
- break;
- }
- case 'l':
- {
- unsigned length = va_arg(args, unsigned);
- const char *s = va_arg(args, const char *);
+ done += length;
- if (buffer && !nettle_buffer_write(buffer, length, s))
- return 0;
+ if (buffer && !NETTLE_BUFFER_PUTC(buffer, ']'))
+ return 0;
+ done++;
+
+ break;
+ }
- done += length;
- break;
- }
- case 'i':
- {
- uint32_t x = va_arg(args, uint32_t);
- unsigned length;
+ case 'l':
+ {
+ const char *s;
+ unsigned length;
+
+ if (nul_flag)
+ {
+ s = va_arg(args, const char *);
+ length = strlen(s);
+ }
+ else
+ {
+ length = va_arg(args, unsigned);
+ s = va_arg(args, const char *);
+ }
+
+ if (buffer && !nettle_buffer_write(buffer, length, s))
+ return 0;
- if (x < 0x80)
- length = 1;
- else if (x < 0x8000L)
- length = 2;
- else if (x < 0x800000L)
- length = 3;
- else if (x < 0x80000000L)
- length = 4;
- else
- length = 5;
+ done += length;
+ break;
+ }
+ case 'i':
+ {
+ uint32_t x = va_arg(args, uint32_t);
+ unsigned length;
- if (buffer && !(NETTLE_BUFFER_PUTC(buffer, '0' + length)
- && NETTLE_BUFFER_PUTC(buffer, ':')))
- return 0;
-
- done += (2 + length);
-
- if (buffer)
- switch(length)
- {
- case 5:
- /* Leading byte needed for the sign. */
- if (!NETTLE_BUFFER_PUTC(buffer, 0))
- return 0;
- /* Fall through */
- case 4:
- if (!NETTLE_BUFFER_PUTC(buffer, x >> 24))
- return 0;
- /* Fall through */
- case 3:
- if (!NETTLE_BUFFER_PUTC(buffer, (x >> 16) & 0xff))
- return 0;
- /* Fall through */
- case 2:
- if (!NETTLE_BUFFER_PUTC(buffer, (x >> 8) & 0xff))
- return 0;
- /* Fall through */
- case 1:
- if (!NETTLE_BUFFER_PUTC(buffer, x & 0xff))
- return 0;
- break;
- default:
- abort();
- }
- break;
- }
- case 'b':
- {
+ if (x < 0x80)
+ length = 1;
+ else if (x < 0x8000L)
+ length = 2;
+ else if (x < 0x800000L)
+ length = 3;
+ else if (x < 0x80000000L)
+ length = 4;
+ else
+ length = 5;
+
+ if (buffer && !(NETTLE_BUFFER_PUTC(buffer, '0' + length)
+ && NETTLE_BUFFER_PUTC(buffer, ':')))
+ return 0;
+
+ done += (2 + length);
+
+ if (buffer)
+ switch(length)
+ {
+ case 5:
+ /* Leading byte needed for the sign. */
+ if (!NETTLE_BUFFER_PUTC(buffer, 0))
+ return 0;
+ /* Fall through */
+ case 4:
+ if (!NETTLE_BUFFER_PUTC(buffer, x >> 24))
+ return 0;
+ /* Fall through */
+ case 3:
+ if (!NETTLE_BUFFER_PUTC(buffer, (x >> 16) & 0xff))
+ return 0;
+ /* Fall through */
+ case 2:
+ if (!NETTLE_BUFFER_PUTC(buffer, (x >> 8) & 0xff))
+ return 0;
+ /* Fall through */
+ case 1:
+ if (!NETTLE_BUFFER_PUTC(buffer, x & 0xff))
+ return 0;
+ break;
+ default:
+ abort();
+ }
+ break;
+ }
+ case 'b':
+ {
#if HAVE_LIBGMP
- const MP_INT *n = va_arg(args, const MP_INT *);
- unsigned length;
- unsigned prefix_length;
+ const MP_INT *n = va_arg(args, const MP_INT *);
+ unsigned length;
+ unsigned prefix_length;
- length = nettle_mpz_sizeinbase_256_s(n);
- prefix_length = format_prefix(buffer, length);
- if (!prefix_length)
- return 0;
-
- done += prefix_length;
-
- if (buffer)
- {
- uint8_t *space = nettle_buffer_space(buffer, length);
- if (!space)
- return 0;
+ length = nettle_mpz_sizeinbase_256_s(n);
+ prefix_length = format_prefix(buffer, length);
+ if (!prefix_length)
+ return 0;
+
+ done += prefix_length;
+
+ if (buffer)
+ {
+ uint8_t *space = nettle_buffer_space(buffer, length);
+ if (!space)
+ return 0;
- nettle_mpz_get_str_256(length, space, n);
- }
+ nettle_mpz_get_str_256(length, space, n);
+ }
- done += length;
+ done += length;
#else /* ! HAVE_LIBGMP */
- abort();
+ abort();
#endif /* ! HAVE_LIBGMP */
- break;
+ break;
+ }
}
- }
+ }
}
}