summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c64
1 files changed, 15 insertions, 49 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 3dff813e3..b90dd29c5 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -282,58 +282,24 @@ void git_buf_join(
const char *str_a,
const char *str_b)
{
- size_t add_size = 0;
- size_t sep_a = 0;
- size_t strlen_a = 0;
- size_t sep_b = 0;
- size_t strlen_b = 0;
- char *ptr;
-
- /* calculate string lengths and need for added separators */
- if (str_a) {
- while (*str_a == separator) { sep_a = 1; str_a++; }
- strlen_a = strlen(str_a);
+ size_t strlen_a = strlen(str_a);
+ size_t strlen_b = strlen(str_b);
+ int need_sep = 0;
+
+ /* figure out if we need to insert a separator */
+ if (separator && strlen_a) {
+ while (*str_b == separator) { str_b++; strlen_b--; }
+ if (str_a[strlen_a - 1] != separator)
+ need_sep = 1;
}
- if (str_b) {
- while (*str_b == separator) { sep_b = 1; str_b++; }
- strlen_b = strlen(str_b);
- }
- if (buf->size > 0) {
- if (buf->ptr[buf->size - 1] == separator) {
- sep_a = 0;
- if (!strlen_a) sep_b = 0;
- } else if (!strlen_a)
- sep_b = (str_b != NULL);
- }
- if (strlen_a > 0) {
- if (str_a[strlen_a - 1] == separator)
- sep_b = 0;
- else if (str_b)
- sep_b = 1;
- }
-
- add_size = sep_a + strlen_a + sep_b + strlen_b;
- if (!add_size) return;
+ ENSURE_SIZE(buf, strlen_a + strlen_b + need_sep + 1);
- ENSURE_SIZE(buf, buf->size + add_size + 1);
+ memmove(buf->ptr, str_a, strlen_a);
+ if (need_sep)
+ buf->ptr[strlen_a] = separator;
+ memmove(buf->ptr + strlen_a + need_sep, str_b, strlen_b);
- /* concatenate strings */
- ptr = buf->ptr + buf->size;
- if (sep_a)
- *ptr++ = separator;
- if (strlen_a) {
- memmove(ptr, str_a, strlen_a);
- ptr += strlen_a;
- }
- if (sep_b)
- *ptr++ = separator;
- if (strlen_b) {
- memmove(ptr, str_b, strlen_b);
- ptr += strlen_b;
- }
-
- /* set size based on num characters actually written */
- buf->size = ptr - buf->ptr;
+ buf->size = strlen_a + strlen_b + need_sep;
buf->ptr[buf->size] = '\0';
}