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>
This commit is contained in:
parent
69ae517541
commit
cb891a5989
87
config.c
87
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…
Reference in New Issue
Block a user