Browse Source

Add a mem_is_zero function (I think we will need this) and a STRUCT_OFFSET macro (we already need this).

svn:r6810
Nick Mathewson 18 years ago
parent
commit
35960e1162
2 changed files with 25 additions and 3 deletions
  1. 20 3
      src/common/util.c
  2. 5 0
      src/common/util.h

+ 20 - 3
src/common/util.c

@@ -428,13 +428,30 @@ find_whitespace(const char *s)
   return s;
 }
 
+/** Return true iff the 'len' bytes at 'mem' are all zero. */
+int tor_mem_is_zero(const char *mem, size_t len)
+{
+  static const char ZERO[] = {
+    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
+  };
+  while (len >= sizeof(ZERO)) {
+    if (memcmp(mem, ZERO, sizeof(ZERO)))
+      return 0;
+    len -= sizeof(ZERO);
+    mem += sizeof(ZERO);
+  }
+  /* Deal with leftover bytes. */
+  if (len)
+    return ! memcmp(mem, ZERO, len);
+
+  return 1;
+}
+
 /** Return true iff the DIGEST_LEN bytes in digest are all zero. */
 int
 tor_digest_is_zero(const char *digest)
 {
-  static char ZERO_DIGEST[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
-
-  return !memcmp(digest, ZERO_DIGEST, DIGEST_LEN);
+  return tor_mem_is_zero(digest, DIGEST_LEN);
 }
 
 #define CHECK_STRTOX_RESULT()                           \

+ 5 - 0
src/common/util.h

@@ -88,6 +88,10 @@ extern int dmalloc_free(const char *file, const int line, void *pnt,
 #define tor_strndup(s, n)      _tor_strndup(s, n DMALLOC_ARGS)
 #define tor_memdup(s, n)       _tor_memdup(s, n DMALLOC_ARGS)
 
+/** Return the offset of <b>member</b> within the type <b>tp</b>, in bytes */
+#define STRUCT_OFFSET(tp, member) \
+  ((off_t) (((char*)&((tp*)0)->member)-(char*)0))
+
 /* String manipulation */
 #define HEX_CHARACTERS "0123456789ABCDEFabcdef"
 void tor_strlower(char *s);
@@ -114,6 +118,7 @@ const char *hex_str(const char *from, size_t fromlen);
 const char *eat_whitespace(const char *s);
 const char *eat_whitespace_no_nl(const char *s);
 const char *find_whitespace(const char *s);
+int tor_mem_is_zero(const char *mem, size_t len);
 int tor_digest_is_zero(const char *digest);
 char *esc_for_log(const char *string);
 const char *escaped(const char *string);