X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=strbuf.c;h=f4201e160de2ccb9f2d9adef695c73a124e676d5;hb=9d3014566302ad0d3d378b0a1653959b3118066d;hp=d1e338bfb695322cf2c90fa39bc8d482a3ade297;hpb=a17ba31b0b75365e1245e494d46abae4afc57480;p=git.git diff --git a/strbuf.c b/strbuf.c index d1e338bfb..f4201e160 100644 --- a/strbuf.c +++ b/strbuf.c @@ -1,27 +1,33 @@ #include "cache.h" +/* + * Used as the default ->buf value, so that people can always assume + * buf is non NULL and ->buf is NUL terminated even for a freshly + * initialized strbuf. + */ +char strbuf_slopbuf[1]; + void strbuf_init(struct strbuf *sb, size_t hint) { - memset(sb, 0, sizeof(*sb)); + sb->alloc = sb->len = 0; + sb->buf = strbuf_slopbuf; if (hint) strbuf_grow(sb, hint); } void strbuf_release(struct strbuf *sb) { - free(sb->buf); - memset(sb, 0, sizeof(*sb)); -} - -void strbuf_reset(struct strbuf *sb) -{ - if (sb->len) - strbuf_setlen(sb, 0); + if (sb->alloc) { + free(sb->buf); + strbuf_init(sb, 0); + } } -char *strbuf_detach(struct strbuf *sb) +char *strbuf_detach(struct strbuf *sb, size_t *sz) { - char *res = sb->buf; + char *res = sb->alloc ? sb->buf : NULL; + if (sz) + *sz = sb->len; strbuf_init(sb, 0); return res; } @@ -40,6 +46,8 @@ void strbuf_grow(struct strbuf *sb, size_t extra) { if (sb->len + extra + 1 <= sb->len) die("you want to use way too much memory"); + if (!sb->alloc) + sb->buf = NULL; ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc); } @@ -178,14 +186,14 @@ int strbuf_getline(struct strbuf *sb, FILE *fp, int term) return 0; } -int strbuf_read_file(struct strbuf *sb, const char *path) +int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint) { int fd, len; fd = open(path, O_RDONLY); if (fd < 0) return -1; - len = strbuf_read(sb, fd, 0); + len = strbuf_read(sb, fd, hint); close(fd); if (len < 0) return -1;