shithub: orca

Download patch

ref: d0602319e882c94fa8eb0223cb53664664f17d7a
parent: 525464c6327088724d2b01356f91ca371d2767f4
author: cancel <cancel@cancel.fm>
date: Tue Jan 7 04:25:15 EST 2020

Cleanup

--- a/thirdparty/gbstring.c
+++ b/thirdparty/gbstring.c
@@ -1,4 +1,5 @@
 #include "gbstring.h"
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -49,6 +50,14 @@
 
 #define GB_STRING_HEADER(s) ((gbStringHeader *)s - 1)
 
+#if defined(__GNUC__) || defined(__clang__)
+#define GB_NOINLINE __attribute__((noinline))
+#elif defined(_MSC_VER)
+#define GB_NOINLINE __declspec(noinline)
+#else
+#define GB_NOINLINE
+#endif
+
 static void gbs_setlen(gbs str, size_t len) {
   GB_STRING_HEADER(str)->len = len;
 }
@@ -57,6 +66,26 @@
   GB_STRING_HEADER(str)->cap = cap;
 }
 
+static GB_NOINLINE gbs gbs_impl_catvprintf(gbs s, const char *fmt, va_list ap) {
+  size_t old_len;
+  int required;
+  va_list cpy;
+  va_copy(cpy, ap);
+  required = vsnprintf(NULL, 0, fmt, cpy);
+  va_end(cpy);
+  if (s) {
+    old_len = GB_STRING_HEADER(s)->len;
+    s = gbs_makeroomfor(s, (size_t)required);
+  } else {
+    old_len = 0;
+    s = gbs_newcap((size_t)required);
+  }
+  if (s == NULL)
+    return NULL;
+  vsnprintf(s + old_len, (size_t)required + 1, fmt, ap);
+  return s;
+}
+
 gbs gbs_newcap(size_t cap) {
   gbStringHeader *header;
   char *str;
@@ -90,15 +119,13 @@
   return gbs_newlen(str, len);
 }
 gbs gbs_newvprintf(const char *fmt, va_list ap) {
-  gbs s;
-  s = gbs_catvprintf(NULL, fmt, ap);
-  return s;
+  return gbs_impl_catvprintf(NULL, fmt, ap);
 }
 gbs gbs_newprintf(char const *fmt, ...) {
   gbs s;
   va_list ap;
   va_start(ap, fmt);
-  s = gbs_catvprintf(NULL, fmt, ap);
+  s = gbs_impl_catvprintf(NULL, fmt, ap);
   va_end(ap);
   return s;
 }
@@ -224,31 +251,21 @@
 }
 
 gbs gbs_catvprintf(gbs s, const char *fmt, va_list ap) {
-  size_t old_len;
-  int required;
-  va_list cpy;
-  va_copy(cpy, ap);
-  required = vsnprintf(NULL, 0, fmt, cpy);
-  va_end(cpy);
-  if (s) {
-    old_len = GB_STRING_HEADER(s)->len;
-    s = gbs_makeroomfor(s, (size_t)required);
-  } else {
-    old_len = 0;
-    s = gbs_newcap((size_t)required);
-  }
-  if (s == NULL)
-    return NULL;
-  vsnprintf(s + old_len, (size_t)required + 1, fmt, ap);
-  return s;
+  // not sure if we should make exception for cat_* functions to allow cat'ing
+  // to null pointer. we should see if it ends up being useful in code, or if
+  // we should just match the existing behavior of sds/gb_string.
+  assert(s != NULL);
+  return gbs_impl_catvprintf(s, fmt, ap);
 }
 
 gbs gbs_catprintf(gbs s, char const *fmt, ...) {
+  assert(s != NULL);
   va_list ap;
   va_start(ap, fmt);
-  s = gbs_catvprintf(s, fmt, ap);
+  s = gbs_impl_catvprintf(s, fmt, ap);
   va_end(ap);
   return s;
 }
 
 #undef GB_STRING_HEADER
+#undef GB_NOINLINE