uncrustify as demanded.
[oweals/gnunet.git] / src / regex / regex_block_lib.c
index a2de3d4f8ba948948d8f4bbe1f23546173fde9ea..f0feb36286aed842494fa01c80f79607fc06071f 100644 (file)
@@ -1,22 +1,22 @@
 /*
      This file is part of GNUnet.
-     (C) 2012,2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2012,2013 GNUnet e.V.
 
-     GNUnet is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
+     Affero General Public License for more details.
 
-     You should have received a copy of the GNU General Public License
-     along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
-*/
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
 /**
  * @author Bartlomiej Polot
  * @file regex/regex_block_lib.c
 #include "regex_block_lib.h"
 #include "gnunet_constants.h"
 
-#define LOG(kind,...) GNUNET_log_from (kind,"regex-bck",__VA_ARGS__)
+#define LOG(kind, ...) GNUNET_log_from(kind, "regex-bck", __VA_ARGS__)
 
 GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
  * Information for each edge.
  */
-struct EdgeInfo
-{
+struct EdgeInfo {
   /**
    * Index of the destination of this edge in the
    * unique destinations array.
@@ -53,9 +52,7 @@ struct EdgeInfo
 /**
  * @brief Block to announce a regex state.
  */
-struct RegexBlock
-{
-
+struct RegexBlock {
   /**
    * Length of the proof regex string.
    */
@@ -85,7 +82,6 @@ struct RegexBlock
   /* followed by 'char tokens[num_edges][edge_info[k].token_length]';
      essentially all of the tokens one after the other in the
      order of the edges; tokens are NOT 0-terminated */
-
 };
 
 
@@ -97,18 +93,18 @@ GNUNET_NETWORK_STRUCT_END
  *
  * @param block block to test
  * @param size number of bytes in block
- * @return GNUNET_YES if the block is accepting, GNUNET_NO if not
- */ 
+ * @return #GNUNET_YES if the block is accepting, #GNUNET_NO if not
+ */
 int
-GNUNET_BLOCK_is_accepting (const struct RegexBlock *block,
-                          size_t size)
+GNUNET_BLOCK_is_accepting(const struct RegexBlock *block,
+                          size_t size)
 {
-  if (size < sizeof (struct RegexBlock))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-  return ntohs (block->is_accepting);
+  if (size < sizeof(struct RegexBlock))
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
+  return ntohs(block->is_accepting);
 }
 
 
@@ -118,32 +114,30 @@ GNUNET_BLOCK_is_accepting (const struct RegexBlock *block,
  * @param proof partial regex of a state
  * @param proof_len number of bytes in 'proof'
  * @param key hash of a state.
- *
- * @return GNUNET_OK if the proof is valid for the given key.
+ * @return #GNUNET_OK if the proof is valid for the given key.
  */
 int
-REGEX_BLOCK_check_proof (const char *proof,
-                        size_t proof_len,
-                        const struct GNUNET_HashCode *key)
+REGEX_BLOCK_check_proof(const char *proof,
+                        size_t proof_len,
+                        const struct GNUNET_HashCode *key)
 {
   struct GNUNET_HashCode key_check;
 
-  if ( (NULL == proof) || (NULL == key))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Proof check failed, was NULL.\n");
-    return GNUNET_NO;
-  }
-  GNUNET_CRYPTO_hash (proof, proof_len, &key_check);
+  if ((NULL == proof) || (NULL == key))
+    {
+      GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Proof check failed, was NULL.\n");
+      return GNUNET_NO;
+    }
+  GNUNET_CRYPTO_hash(proof, proof_len, &key_check);
   return (0 ==
-          GNUNET_CRYPTO_hash_cmp (key, &key_check)) ? GNUNET_OK : GNUNET_NO;
+          GNUNET_CRYPTO_hash_cmp(key, &key_check)) ? GNUNET_OK : GNUNET_NO;
 }
 
 
 /**
  * Struct to keep track of the xquery while iterating all the edges in a block.
  */
-struct CheckEdgeContext
-{
+struct CheckEdgeContext {
   /**
    * Xquery: string we are looking for.
    */
@@ -153,7 +147,6 @@ struct CheckEdgeContext
    * Has any edge matched the xquery so far? (GNUNET_OK / GNUNET_NO)
    */
   int found;
-
 };
 
 
@@ -164,25 +157,28 @@ struct CheckEdgeContext
  * @param token Token that follows to next state.
  * @param len Lenght of token.
  * @param key Hash of next state.
- * 
- * @return GNUNET_YES, to keep iterating
+ *
+ * @return #GNUNET_YES, to keep iterating
  */
 static int
-check_edge (void *cls,
-            const char *token,
-            size_t len,
-            const struct GNUNET_HashCode *key)
+check_edge(void *cls,
+           const char *token,
+           size_t len,
+           const struct GNUNET_HashCode *key)
 {
   struct CheckEdgeContext *ctx = cls;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
-             "edge %.*s [%u]: %s->%s\n",
-              (int) len, token, len, GNUNET_h2s(key));
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+             "edge %.*s [%u]: %s\n",
+             (int)len,
+             token,
+             (unsigned int)len,
+             GNUNET_h2s(key));
   if (NULL == ctx->xquery)
     return GNUNET_YES;
-  if (strlen (ctx->xquery) < len)
+  if (strlen(ctx->xquery) < len)
     return GNUNET_YES; /* too long */
-  if (0 == strncmp (ctx->xquery, token, len))
+  if (0 == strncmp(ctx->xquery, token, len))
     ctx->found = GNUNET_OK;
   return GNUNET_YES; /* keep checking for malformed data! */
 }
@@ -196,53 +192,53 @@ check_edge (void *cls,
  * @param query the query for the block
  * @param xquery String describing the edge we are looking for.
  *               Can be NULL in case this is a put block.
- *
- * @return GNUNET_OK in case it's fine.
- *         GNUNET_NO in case the xquery exists and is not found (IRRELEVANT).
- *         GNUNET_SYSERR if the block is invalid.
+ * @return #GNUNET_OK in case it's fine.
+ *         #GNUNET_NO in case the xquery exists and is not found (IRRELEVANT).
+ *         #GNUNET_SYSERR if the block is invalid.
  */
 int
-REGEX_BLOCK_check (const struct RegexBlock *block,
-                  size_t size,
-                  const struct GNUNET_HashCode *query,
-                  const char *xquery)
+REGEX_BLOCK_check(const struct RegexBlock *block,
+                  size_t size,
+                  const struct GNUNET_HashCode *query,
+                  const char *xquery)
 {
   struct GNUNET_HashCode key;
   struct CheckEdgeContext ctx;
   int res;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Block check\n");
-  if (GNUNET_OK != 
-      REGEX_BLOCK_get_key (block, size,
-                          &key))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
+  LOG(GNUNET_ERROR_TYPE_DEBUG,
+      "Block check\n");
+  if (GNUNET_OK !=
+      REGEX_BLOCK_get_key(block, size,
+                          &key))
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
   if (NULL != query &&
-      0 != memcmp (&key,
-                   query,
-                   sizeof (struct GNUNET_HashCode)))
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-  if ( (GNUNET_YES == ntohs (block->is_accepting)) &&
-       ( (NULL == xquery) || ('\0' == xquery[0]) ) )
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "  out! Is accepting: %u, xquery %p\n",
-       ntohs(block->is_accepting), xquery);
-    return GNUNET_OK;
-  }
+      0 != GNUNET_memcmp(&key,
+                         query))
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
+  if ((GNUNET_YES == ntohs(block->is_accepting)) &&
+      ((NULL == xquery) || ('\0' == xquery[0])))
+    {
+      LOG(GNUNET_ERROR_TYPE_DEBUG,
+          "  out! Is accepting: %u, xquery %p\n",
+          ntohs(block->is_accepting),
+          xquery);
+      return GNUNET_OK;
+    }
   ctx.xquery = xquery;
   ctx.found = GNUNET_NO;
-  res = REGEX_BLOCK_iterate (block, size, &check_edge, &ctx);
+  res = REGEX_BLOCK_iterate(block, size, &check_edge, &ctx);
   if (GNUNET_SYSERR == res)
     return GNUNET_SYSERR;
   if (NULL == xquery)
     return GNUNET_YES;
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Result %d\n", ctx.found);
+  LOG(GNUNET_ERROR_TYPE_DEBUG, "Result %d\n", ctx.found);
   return ctx.found;
 }
 
@@ -253,12 +249,12 @@ REGEX_BLOCK_check (const struct RegexBlock *block,
  * @param block block to get the key from
  * @param block_len number of bytes in block
  * @param key where to store the key
- * @return GNUNET_OK on success, GNUNET_SYSERR if the block is malformed
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR if the block is malformed
  */
 int
-REGEX_BLOCK_get_key (const struct RegexBlock *block,
-                    size_t block_len,
-                    struct GNUNET_HashCode *key)
+REGEX_BLOCK_get_key(const struct RegexBlock *block,
+                    size_t block_len,
+                    struct GNUNET_HashCode *key)
 {
   uint16_t len;
   const struct GNUNET_HashCode *destinations;
@@ -267,23 +263,23 @@ REGEX_BLOCK_get_key (const struct RegexBlock *block,
   uint16_t num_edges;
   size_t total;
 
-  if (block_len < sizeof (struct RegexBlock)) 
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }  
-  num_destinations = ntohs (block->num_destinations);
-  num_edges = ntohs (block->num_edges);
-  len = ntohs (block->proof_len);
-  destinations = (const struct GNUNET_HashCode *) &block[1];
-  edges = (const struct EdgeInfo *) &destinations[num_destinations];
-  total = sizeof (struct RegexBlock) + num_destinations * sizeof (struct GNUNET_HashCode) + num_edges + sizeof (struct EdgeInfo) + len;  
+  if (block_len < sizeof(struct RegexBlock))
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
+  num_destinations = ntohs(block->num_destinations);
+  num_edges = ntohs(block->num_edges);
+  len = ntohs(block->proof_len);
+  destinations = (const struct GNUNET_HashCode *)&block[1];
+  edges = (const struct EdgeInfo *)&destinations[num_destinations];
+  total = sizeof(struct RegexBlock) + num_destinations * sizeof(struct GNUNET_HashCode) + num_edges * sizeof(struct EdgeInfo) + len;
   if (block_len < total)
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-  GNUNET_CRYPTO_hash (&edges[num_edges], len, key);
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
+  GNUNET_CRYPTO_hash(&edges[num_edges], len, key);
   return GNUNET_OK;
 }
 
@@ -292,23 +288,22 @@ REGEX_BLOCK_get_key (const struct RegexBlock *block,
  * Iterate over all edges of a block of a regex state.
  *
  * @param block Block to iterate over.
- * @param size Size of block.
+ * @param size Size of @a block.
  * @param iterator Function to call on each edge in the block.
- * @param iter_cls Closure for the iterator.
- *
- * @return GNUNET_SYSERR if an error has been encountered.
- *         GNUNET_OK if no error has been encountered.
+ * @param iter_cls Closure for the @a iterator.
+ * @return #GNUNET_SYSERR if an error has been encountered.
+ *         #GNUNET_OK if no error has been encountered.
  *           Note that if the iterator stops the iteration by returning
- *         GNUNET_NO, the block will no longer be checked for further errors.
+ *         #GNUNET_NO, the block will no longer be checked for further errors.
  *           The return value will be GNUNET_OK meaning that no errors were
  *         found until the edge last notified to the iterator, but there might
  *         be errors in further edges.
  */
 int
-REGEX_BLOCK_iterate (const struct RegexBlock *block,
-                    size_t size,
-                    REGEX_INTERNAL_EgdeIterator iterator,
-                    void *iter_cls)
+REGEX_BLOCK_iterate(const struct RegexBlock *block,
+                    size_t size,
+                    REGEX_INTERNAL_EgdeIterator iterator,
+                    void *iter_cls)
 {
   uint16_t len;
   const struct GNUNET_HashCode *destinations;
@@ -320,53 +315,54 @@ REGEX_BLOCK_iterate (const struct RegexBlock *block,
   unsigned int n;
   size_t off;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Block iterate\n");
-  if (size < sizeof (struct RegexBlock)) 
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-  num_destinations = ntohs (block->num_destinations);
-  num_edges = ntohs (block->num_edges);
-  len = ntohs (block->proof_len);
-  destinations = (const struct GNUNET_HashCode *) &block[1];
-  edges = (const struct EdgeInfo *) &destinations[num_destinations];
-  aux = (const char *) &edges[num_edges];
-  total = sizeof (struct RegexBlock) + num_destinations * sizeof (struct GNUNET_HashCode) + num_edges * sizeof (struct EdgeInfo) + len;
-  if (size < total) 
-  {
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
-  for (n=0;n<num_edges;n++)
-    total += ntohs (edges[n].token_length);    
-  if (size != total) 
-  {
-    fprintf (stderr, "Expected %u, got %u\n",
-            (unsigned int) size,
-            (unsigned int) total);
-    GNUNET_break_op (0);
-    return GNUNET_SYSERR;
-  }
+  LOG(GNUNET_ERROR_TYPE_DEBUG, "Block iterate\n");
+  if (size < sizeof(struct RegexBlock))
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
+  num_destinations = ntohs(block->num_destinations);
+  num_edges = ntohs(block->num_edges);
+  len = ntohs(block->proof_len);
+  destinations = (const struct GNUNET_HashCode *)&block[1];
+  edges = (const struct EdgeInfo *)&destinations[num_destinations];
+  aux = (const char *)&edges[num_edges];
+  total = sizeof(struct RegexBlock) + num_destinations * sizeof(struct GNUNET_HashCode) + num_edges * sizeof(struct EdgeInfo) + len;
+  if (size < total)
+    {
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
+  for (n = 0; n < num_edges; n++)
+    total += ntohs(edges[n].token_length);
+  if (size != total)
+    {
+      fprintf(stderr, "Expected %u, got %u\n",
+              (unsigned int)size,
+              (unsigned int)total);
+      GNUNET_break_op(0);
+      return GNUNET_SYSERR;
+    }
   off = len;
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Start iterating block of size %u, proof %u, off %u edges %u\n",
-       size, len, off, n);
+  LOG(GNUNET_ERROR_TYPE_DEBUG,
+      "Start iterating block of size %u, proof %u, off %u edges %u\n",
+      size, len, off, n);
   /* &aux[off] always points to our token */
-  for (n=0;n<num_edges;n++)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG,
-        " Edge %u/%u, off %u tokenlen %u (%.*s)\n", n+1, num_edges, off,
-        ntohs (edges[n].token_length), ntohs (edges[n].token_length),
-         &aux[off]);
-    if (NULL != iterator)
-      if (GNUNET_NO == iterator (iter_cls, 
-                                &aux[off], 
-                                ntohs (edges[n].token_length),
-                                &destinations[ntohs (edges[n].destination_index)]))
-       return GNUNET_OK;
-    off += ntohs (edges[n].token_length);
-  }
+  for (n = 0; n < num_edges; n++)
+    {
+      LOG(GNUNET_ERROR_TYPE_DEBUG,
+          "Edge %u/%u, off %u tokenlen %u (%.*s)\n",
+          n + 1, num_edges, off,
+          ntohs(edges[n].token_length), ntohs(edges[n].token_length),
+          &aux[off]);
+      if (NULL != iterator)
+        if (GNUNET_NO == iterator(iter_cls,
+                                  &aux[off],
+                                  ntohs(edges[n].token_length),
+                                  &destinations[ntohs(edges[n].destination_index)]))
+          return GNUNET_OK;
+      off += ntohs(edges[n].token_length);
+    }
   return GNUNET_OK;
 }
 
@@ -382,11 +378,11 @@ REGEX_BLOCK_iterate (const struct RegexBlock *block,
  * @return the regex block, NULL on error
  */
 struct RegexBlock *
-REGEX_BLOCK_create (const char *proof,
-                   unsigned int num_edges,
-                   const struct REGEX_BLOCK_Edge *edges,
-                   int accepting,
-                   size_t *rsize)
+REGEX_BLOCK_create(const char *proof,
+                   unsigned int num_edges,
+                   const struct REGEX_BLOCK_Edge *edges,
+                   int accepting,
+                   size_t *rsize)
 {
   struct RegexBlock *block;
   struct GNUNET_HashCode destinations[1024]; /* 1024 = 64k/64 bytes/key == absolute MAX */
@@ -402,64 +398,64 @@ REGEX_BLOCK_create (const char *proof,
   unsigned int i;
   char *aux;
 
-  len = strlen (proof);
-  if (len > UINT16_MAX) 
-  {
-    GNUNET_break (0);
-    return NULL;
-  }
-  unique_destinations = 0;
-  total = sizeof (struct RegexBlock) + len;
-  for (i=0;i<num_edges;i++)
-  {
-    slen = strlen (edges[i].label);
-    if (slen > UINT16_MAX) 
+  len = strlen(proof);
+  if (len > UINT16_MAX)
     {
-      GNUNET_break (0);
+      GNUNET_break(0);
       return NULL;
     }
-    total += slen;
-    for (j=0;j<unique_destinations;j++)
-      if (0 == memcmp (&destinations[j],
-                      &edges[i].destination,
-                      sizeof (struct GNUNET_HashCode)))
-       break;
-    if (j >= 1024)
+  unique_destinations = 0;
+  total = sizeof(struct RegexBlock) + len;
+  for (i = 0; i < num_edges; i++)
+    {
+      slen = strlen(edges[i].label);
+      if (slen > UINT16_MAX)
+        {
+          GNUNET_break(0);
+          return NULL;
+        }
+      total += slen;
+      for (j = 0; j < unique_destinations; j++)
+        if (0 == memcmp(&destinations[j],
+                        &edges[i].destination,
+                        sizeof(struct GNUNET_HashCode)))
+          break;
+      if (j >= 1024)
+        {
+          GNUNET_break(0);
+          return NULL;
+        }
+      destination_indices[i] = j;
+      if (j == unique_destinations)
+        destinations[unique_destinations++] = edges[i].destination;
+    }
+  total += num_edges * sizeof(struct EdgeInfo) + unique_destinations * sizeof(struct GNUNET_HashCode);
+  if (total >= GNUNET_CONSTANTS_MAX_BLOCK_SIZE)
     {
-      GNUNET_break (0);
+      GNUNET_break(0);
       return NULL;
     }
-    destination_indices[i] = j;
-    if (j == unique_destinations)
-      destinations[unique_destinations++] = edges[i].destination;
-  }
-  total += num_edges * sizeof (struct EdgeInfo) + unique_destinations * sizeof (struct GNUNET_HashCode);
-  if (total >= GNUNET_CONSTANTS_MAX_BLOCK_SIZE)
-  {
-    GNUNET_break (0);
-    return NULL;
-  }
-  block = GNUNET_malloc (total);
-  block->proof_len = htons (len);
-  block->is_accepting = htons (accepting);
-  block->num_edges = htons (num_edges);
-  block->num_destinations = htons (unique_destinations);
-  dests = (struct GNUNET_HashCode *) &block[1];
-  memcpy (dests, destinations, sizeof (struct GNUNET_HashCode) * unique_destinations);
-  edgeinfos = (struct EdgeInfo *) &dests[unique_destinations];
-  aux = (char *) &edgeinfos[num_edges];
+  block = GNUNET_malloc(total);
+  block->proof_len = htons(len);
+  block->is_accepting = htons(accepting);
+  block->num_edges = htons(num_edges);
+  block->num_destinations = htons(unique_destinations);
+  dests = (struct GNUNET_HashCode *)&block[1];
+  GNUNET_memcpy(dests, destinations, sizeof(struct GNUNET_HashCode) * unique_destinations);
+  edgeinfos = (struct EdgeInfo *)&dests[unique_destinations];
+  aux = (char *)&edgeinfos[num_edges];
   off = len;
-  memcpy (aux, proof, len); 
-  for (i=0;i<num_edges;i++)
-  {
-    slen = strlen (edges[i].label);
-    edgeinfos[i].token_length = htons ((uint16_t) slen);
-    edgeinfos[i].destination_index = htons (destination_indices[i]);
-    memcpy (&aux[off],
-           edges[i].label,
-           slen);
-    off += slen;
-  }
+  GNUNET_memcpy(aux, proof, len);
+  for (i = 0; i < num_edges; i++)
+    {
+      slen = strlen(edges[i].label);
+      edgeinfos[i].token_length = htons((uint16_t)slen);
+      edgeinfos[i].destination_index = htons(destination_indices[i]);
+      GNUNET_memcpy(&aux[off],
+                    edges[i].label,
+                    slen);
+      off += slen;
+    }
   *rsize = total;
   return block;
 }