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