Use strbufs instead of open-coded string manipulation
authorAlex Riesen <raa.lkml@gmail.com>
Fri, 26 Mar 2010 22:56:01 +0000 (23:56 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 28 Mar 2010 16:50:02 +0000 (09:50 -0700)
Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
config.c

index b6a4257627373b2ce83321a7f21b0c86e50b9641..7df966490309c411b3137f3bd859e057c81b98a0 100644 (file)
--- a/config.c
+++ b/config.c
@@ -7,6 +7,7 @@
  */
 #include "cache.h"
 #include "exec_cmd.h"
+#include "strbuf.h"
 
 #define MAXNAME (256)
 
@@ -21,8 +22,8 @@ const char *config_exclusive_filename = NULL;
 struct config_item
 {
        struct config_item *next;
+       char *name;
        char *value;
-       char name[1 /* NUL */];
 };
 static struct config_item *config_parameters;
 static struct config_item **config_parameters_tail = &config_parameters;
@@ -32,43 +33,29 @@ static void lowercase(char *p)
        for (; *p; p++)
                *p = tolower(*p);
 }
-static char *skip_space(const char *p)
-{
-       for (; *p; p++)
-               if (!isspace(*p))
-                       break;
-       return (char *)p;
-}
-static char *trailing_space(const char *begin, const char *p)
-{
-       while (p-- > begin)
-               if (!isspace(*p))
-                       break;
-       return (char *)p + 1;
-}
 
 int git_config_parse_parameter(const char *text)
 {
        struct config_item *ct;
-       const char *name;
-       const char *val;
-       name = skip_space(text);
-       text = val = strchr(name, '=');
-       if (!text)
-               text = name + strlen(name);
-       text = trailing_space(name, text);
-       if (text <= name)
+       struct strbuf tmp = STRBUF_INIT;
+       struct strbuf **pair;
+       strbuf_addstr(&tmp, text);
+       pair = strbuf_split(&tmp, '=');
+       if (pair[0]->len && pair[0]->buf[pair[0]->len - 1] == '=')
+               strbuf_setlen(pair[0], pair[0]->len - 1);
+       strbuf_trim(pair[0]);
+       if (!pair[0]->len) {
+               strbuf_list_free(pair);
                return -1;
-       ct = xcalloc(1, sizeof(struct config_item) + (text - name));
-       memcpy(ct->name, name, text - name);
-       lowercase(ct->name);
-       if (!val)
-               ct->value = NULL;
-       else {
-               val = skip_space(++val /* skip "=" */);
-               text = trailing_space(val, val + strlen(val));
-               ct->value = xstrndup(val, text - val);
        }
+       ct = xcalloc(1, sizeof(struct config_item));
+       ct->name = strbuf_detach(pair[0], NULL);
+       if (pair[1]) {
+               strbuf_trim(pair[1]);
+               ct->value = strbuf_detach(pair[1], NULL);
+       }
+       strbuf_list_free(pair);
+       lowercase(ct->name);
        *config_parameters_tail = ct;
        config_parameters_tail = &ct->next;
        return 0;