chiark / gitweb /
style: util.[ch]: Introduce hex_encode_alloc name
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 28 Sep 2019 10:55:17 +0000 (11:55 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 28 Sep 2019 10:55:17 +0000 (11:55 +0100)
Prompted by review of 7be31e47b2a8
  "util.[ch]: Factor out hex encoding and decoding utilities."
which says
  The interface is a bit odd, but it will fit with the uses
  I have in mind.

Not sure if it's the encode or decode interface which is referred to.
Certainly there should be a non-allocating variant.  I decided to
rename the allocating one.

The two separate buffer arguments to hex_decode are indeed a bit odd
but IMO tolerable.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
util.c
util.h

diff --git a/util.c b/util.c
index 4729df4..5200e18 100644 (file)
--- a/util.c
+++ b/util.c
@@ -93,18 +93,23 @@ void *safe_malloc_ary(size_t size, size_t count, const char *message) {
     return safe_realloc_ary(0,size,count,message);
 }
 
-string_t hex_encode(const uint8_t *bin, int binsize)
+void hex_encode(const uint8_t *bin, int binsize, char *buff)
 {
-    char *buff;
     int i;
 
-    buff=safe_malloc(binsize*2 + 1,"hex_encode");
-
     for (i=0; i<binsize; i++) {
        buff[i*2]=hexdigits[(bin[i] & 0xf0) >> 4];
        buff[i*2+1]=hexdigits[(bin[i] & 0xf)];
     }
     buff[binsize*2]=0;
+}
+
+string_t hex_encode_alloc(const uint8_t *bin, int binsize)
+{
+    char *buff;
+
+    buff=safe_malloc(hex_encode_size(binsize),"hex_encode");
+    hex_encode(bin,binsize,buff);
     return buff;
 }
 
@@ -164,7 +169,7 @@ done:
 
 void read_mpbin(MP_INT *a, uint8_t *bin, int binsize)
 {
-    char *buff = hex_encode(bin, binsize);
+    char *buff = hex_encode_alloc(bin, binsize);
     mpz_set_str(a, buff, 16);
     free(buff);
 }
diff --git a/util.h b/util.h
index 0a96556..eb9e51f 100644 (file)
--- a/util.h
+++ b/util.h
@@ -89,9 +89,11 @@ extern void buf_append_string(struct buffer_if *buf, cstring_t s);
   /* Append a two-byte length and the string to the buffer. Length is in
    * network byte order. */
 
-extern string_t hex_encode(const uint8_t *bin, int binsize);
-  /* Convert a byte array to hex, returning the result in a freshly allocated
-   * string. */
+static inline int hex_encode_size(int binsize) { return binsize*2 + 1; }
+extern void hex_encode(const uint8_t *bin, int binsize, char *buf);
+  /* Convert a byte array to hex into a supplied buffer. */
+extern string_t hex_encode_alloc(const uint8_t *bin, int binsize);
+  /* Returns the result in a freshly allocated string. */
 
 extern bool_t hex_decode(uint8_t *buffer, int32_t buflen, int32_t *outlen,
                         cstring_t hb, bool_t allow_odd_nibble);