From 899af3c0d904b985a3f611493415fa61d80ef4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Fri, 15 Nov 2002 09:02:30 +0100 Subject: [PATCH] (sexp_iterator_get_uint32): New function. Rev: src/nettle/sexp.c:1.12 Rev: src/nettle/sexp.h:1.9 --- sexp.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ sexp.h | 4 ++++ 2 files changed, 48 insertions(+) diff --git a/sexp.c b/sexp.c index b35f9cb1..1e093485 100644 --- a/sexp.c +++ b/sexp.c @@ -25,6 +25,8 @@ #include "sexp.h" +#include "macros.h" + #include <stdlib.h> #include <string.h> @@ -222,6 +224,48 @@ sexp_iterator_subexpr(struct sexp_iterator *iterator, return iterator->buffer + start; } +int +sexp_iterator_get_uint32(struct sexp_iterator *iterator, + uint32_t *x) +{ + if (iterator->type == SEXP_ATOM + && !iterator->display + && iterator->atom_length + && iterator->atom[0] < 0x80) + { + unsigned length = iterator->atom_length; + const uint8_t *p = iterator->atom; + + /* Skip leading zeros. */ + while(length && !*p) + { + length--; p++; + } + + switch(length) + { + case 0: + *x = 0; + break; + case 1: + *x = p[0]; + break; + case 2: + *x = READ_UINT16(p); + break; + case 3: + *x = READ_UINT24(p); + break; + case 4: + *x = READ_UINT32(p); + break; + default: + return 0; + } + return sexp_iterator_next(iterator); + } + return 0; +} int sexp_iterator_check_type(struct sexp_iterator *iterator, diff --git a/sexp.h b/sexp.h index 72bbae9c..074c7c8f 100644 --- a/sexp.h +++ b/sexp.h @@ -83,6 +83,10 @@ const uint8_t * sexp_iterator_subexpr(struct sexp_iterator *iterator, unsigned *length); +int +sexp_iterator_get_uint32(struct sexp_iterator *iterator, + uint32_t *x); + /* Checks the type of the current expression, which should be a list * -- GitLab