Browse Source

Use a strbuf for building up section header and key/value pair strings.

Avoids horrible 1-byte write(2) calls and cleans up the logic a bit.

Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Kristian Høgsberg 17 years ago committed by Junio C Hamano
parent
commit
cb891a5989
  1. 91
      config.c

91
config.c

@ -610,46 +610,36 @@ static int write_error(void)


static int store_write_section(int fd, const char* key) static int store_write_section(int fd, const char* key)
{ {
const char *dot = strchr(key, '.'); const char *dot;
int len1 = store.baselen, len2 = -1; int i, success;
struct strbuf sb;


dot = strchr(key, '.'); strbuf_init(&sb, 0);
dot = memchr(key, '.', store.baselen);
if (dot) { if (dot) {
int dotlen = dot - key; strbuf_addf(&sb, "[%.*s \"", (int)(dot - key), key);
if (dotlen < len1) { for (i = dot - key + 1; i < store.baselen; i++) {
len2 = len1 - dotlen - 1; if (key[i] == '"')
len1 = dotlen; strbuf_addch(&sb, '\\');
strbuf_addch(&sb, key[i]);
} }
strbuf_addstr(&sb, "\"]\n");
} else {
strbuf_addf(&sb, "[%.*s]\n", store.baselen, key);
} }


if (write_in_full(fd, "[", 1) != 1 || success = write_in_full(fd, sb.buf, sb.len) == sb.len;
write_in_full(fd, key, len1) != len1) strbuf_release(&sb);
return 0;
if (len2 >= 0) {
if (write_in_full(fd, " \"", 2) != 2)
return 0;
while (--len2 >= 0) {
unsigned char c = *++dot;
if (c == '"')
if (write_in_full(fd, "\\", 1) != 1)
return 0;
if (write_in_full(fd, &c, 1) != 1)
return 0;
}
if (write_in_full(fd, "\"", 1) != 1)
return 0;
}
if (write_in_full(fd, "]\n", 2) != 2)
return 0;


return 1; return success;
} }


static int store_write_pair(int fd, const char* key, const char* value) static int store_write_pair(int fd, const char* key, const char* value)
{ {
int i; int i, success;
int length = strlen(key+store.baselen+1); int length = strlen(key + store.baselen + 1);
int quote = 0; const char *quote = "";
struct strbuf sb;


/* /*
* Check to see if the value needs to be surrounded with a dq pair. * Check to see if the value needs to be surrounded with a dq pair.
@ -659,43 +649,38 @@ static int store_write_pair(int fd, const char* key, const char* value)
* configuration parser. * configuration parser.
*/ */
if (value[0] == ' ') if (value[0] == ' ')
quote = 1; quote = "\"";
for (i = 0; value[i]; i++) for (i = 0; value[i]; i++)
if (value[i] == ';' || value[i] == '#') if (value[i] == ';' || value[i] == '#')
quote = 1; quote = "\"";
if (i && value[i-1] == ' ') if (i && value[i - 1] == ' ')
quote = 1; quote = "\"";

strbuf_init(&sb, 0);
strbuf_addf(&sb, "\t%.*s = %s",
length, key + store.baselen + 1, quote);


if (write_in_full(fd, "\t", 1) != 1 ||
write_in_full(fd, key+store.baselen+1, length) != length ||
write_in_full(fd, " = ", 3) != 3)
return 0;
if (quote && write_in_full(fd, "\"", 1) != 1)
return 0;
for (i = 0; value[i]; i++) for (i = 0; value[i]; i++)
switch (value[i]) { switch (value[i]) {
case '\n': case '\n':
if (write_in_full(fd, "\\n", 2) != 2) strbuf_addstr(&sb, "\\n");
return 0;
break; break;
case '\t': case '\t':
if (write_in_full(fd, "\\t", 2) != 2) strbuf_addstr(&sb, "\\t");
return 0;
break; break;
case '"': case '"':
case '\\': case '\\':
if (write_in_full(fd, "\\", 1) != 1) strbuf_addch(&sb, '\\');
return 0;
default: default:
if (write_in_full(fd, value+i, 1) != 1) strbuf_addch(&sb, value[i]);
return 0;
break; break;
} }
if (quote && write_in_full(fd, "\"", 1) != 1) strbuf_addf(&sb, "%s\n", quote);
return 0;
if (write_in_full(fd, "\n", 1) != 1) success = write_in_full(fd, sb.buf, sb.len) == sb.len;
return 0; strbuf_release(&sb);
return 1;
return success;
} }


static ssize_t find_beginning_of_line(const char* contents, size_t size, static ssize_t find_beginning_of_line(const char* contents, size_t size,

Loading…
Cancel
Save