make GCPP_2s also return static string
authorChristian Grothoff <christian@grothoff.org>
Sun, 22 Jan 2017 13:06:35 +0000 (14:06 +0100)
committerChristian Grothoff <christian@grothoff.org>
Sun, 22 Jan 2017 13:06:41 +0000 (14:06 +0100)
src/cadet/gnunet-service-cadet-new_paths.c
src/cadet/gnunet-service-cadet-new_paths.h

index aff46db07667242de38df51e1fb4ce1b052f6d27..bbe9af8b413f4c0a5df75c7ef1b81fd88b7bf7c8 100644 (file)
@@ -627,6 +627,7 @@ struct CadetPeer *
 GCPP_get_peer_at_offset (struct CadetPeerPath *path,
                          unsigned int off)
 {
+  GNUNET_assert (off < path->entries_length);
   return path->entries[off].peer;
 }
 
@@ -637,26 +638,34 @@ GCPP_get_peer_at_offset (struct CadetPeerPath *path,
  * @param path path to convert
  * @return string, to be freed by caller (unlike other *_2s APIs!)
  */
-char *
+const char *
 GCPP_2s (struct CadetPeerPath *path)
 {
-  char *s;
-  char *old;
+  static char buf[2048];
+  size_t off;
+  const unsigned int max_plen = sizeof(buf) / 5 - 2; /* 5 characters per entry */
 
-  old = GNUNET_strdup ("");
+  off = 0;
   for (unsigned int i = 0;
        i < path->entries_length;
        i++)
   {
-    GNUNET_asprintf (&s,
-                     "%s %s",
-                     old,
-                     GNUNET_i2s (GCP_get_id (GCPP_get_peer_at_offset (path,
-                                                                      i))));
-    GNUNET_free_non_null (old);
-    old = s;
+    if ( (path->entries_length > max_plen) &&
+         (i == max_plen / 2) )
+      off += GNUNET_snprintf (&buf[off],
+                              sizeof (buf) - off,
+                              "... ");
+    if ( (path->entries_length > max_plen) &&
+         (i > max_plen / 2) &&
+         (i < path->entries_length - max_plen / 2) )
+      continue;
+    off += GNUNET_snprintf (&buf[off],
+                            sizeof (buf) - off,
+                            "%s ",
+                            GNUNET_i2s (GCP_get_id (GCPP_get_peer_at_offset (path,
+                                                                             i))));
   }
-  return old;
+  return buf;
 }
 
 
index 5714368c7d80c8222eadcfe0c343902e4dae6d24..7310d75e640e0b72c47a0a06c5286dd75a9e9a3e 100644 (file)
@@ -173,9 +173,9 @@ GCPP_get_peer_at_offset (struct CadetPeerPath *path,
  * Convert a path to a human-readable string.
  *
  * @param path path to convert
- * @return string, to be freed by caller (unlike other *_2s APIs!)
+ * @return string, statically allocated
  */
-char *
+const char *
 GCPP_2s (struct CadetPeerPath *p);