int fsck_error_function(struct object *obj, int type, const char *fmt, ...) { va_list ap; int len; struct strbuf sb = STRBUF_INIT; strbuf_addf(&sb, "object %s:", obj->sha1?sha1_to_hex(obj->sha1):"(null)"); va_start(ap, fmt); len = vsnprintf(sb.buf + sb.len, strbuf_avail(&sb), fmt, ap); va_end(ap); if (len < 0) len = 0; if (len >= strbuf_avail(&sb)) { strbuf_grow(&sb, len + 2); va_start(ap, fmt); len = vsnprintf(sb.buf + sb.len, strbuf_avail(&sb), fmt, ap); va_end(ap); if (len >= strbuf_avail(&sb)) die("this should not happen, your snprintf is broken"); } error("%s", sb.buf); strbuf_release(&sb); return 1; }
void trace_printf(const char *fmt, ...) { struct strbuf buf; va_list ap; int fd, len, need_close = 0; fd = get_trace_fd(&need_close); if (!fd) return; set_try_to_free_routine(do_nothing); /* is never reset */ strbuf_init(&buf, 64); va_start(ap, fmt); len = vsnprintf(buf.buf, strbuf_avail(&buf), fmt, ap); va_end(ap); if (len >= strbuf_avail(&buf)) { strbuf_grow(&buf, len - strbuf_avail(&buf) + 128); va_start(ap, fmt); len = vsnprintf(buf.buf, strbuf_avail(&buf), fmt, ap); va_end(ap); if (len >= strbuf_avail(&buf)) die("broken vsnprintf"); } strbuf_setlen(&buf, len); write_or_whine_pipe(fd, buf.buf, buf.len, err_msg); strbuf_release(&buf); if (need_close) close(fd); }
static void output(struct merge_options *o, int v, const char *fmt, ...) { int len; va_list ap; if (!show(o, v)) return; strbuf_grow(&o->obuf, o->call_depth * 2 + 2); memset(o->obuf.buf + o->obuf.len, ' ', o->call_depth * 2); strbuf_setlen(&o->obuf, o->obuf.len + o->call_depth * 2); va_start(ap, fmt); len = vsnprintf(o->obuf.buf + o->obuf.len, strbuf_avail(&o->obuf), fmt, ap); va_end(ap); if (len < 0) len = 0; if (len >= strbuf_avail(&o->obuf)) { strbuf_grow(&o->obuf, len + 2); va_start(ap, fmt); len = vsnprintf(o->obuf.buf + o->obuf.len, strbuf_avail(&o->obuf), fmt, ap); va_end(ap); if (len >= strbuf_avail(&o->obuf)) { die("this should not happen, your snprintf is broken"); } } strbuf_setlen(&o->obuf, o->obuf.len + len); strbuf_add(&o->obuf, "\n", 1); if (!o->buffer_output) flush_output(o); }
static int strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap) { int len, ret; va_list ap_saved; if (!strbuf_avail(sb)) { ret = strbuf_grow(sb, 64); if (ret) return ret; } va_copy(ap_saved, ap); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); if (len < 0) return len; if (len > strbuf_avail(sb)) { ret = strbuf_grow(sb, len); if (ret) return ret; len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved); va_end(ap_saved); if (len > strbuf_avail(sb)) { pr_debug("this should not happen, your vsnprintf is broken"); return -EINVAL; } } return strbuf_setlen(sb, sb->len + len); }
void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap) { int len; va_list cp; if (!strbuf_avail(sb)) strbuf_grow(sb, 64); va_copy(cp, ap); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, cp); va_end(cp); if (len < 0) die("BUG: your vsnprintf is broken (returned %d)", len); if (len > strbuf_avail(sb)) { strbuf_grow(sb, len); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); if (len > strbuf_avail(sb)) die("BUG: your vsnprintf is broken (insatiable)"); } strbuf_setlen(sb, sb->len + len); }
void strbuf_addf(struct strbuf *sb, const char *fmt, ...) { int len; va_list ap; va_start(ap, fmt); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); va_end(ap); if (len < 0) len = 0; if (len > strbuf_avail(sb)) { strbuf_grow(sb, len); va_start(ap, fmt); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); va_end(ap); if (len > strbuf_avail(sb)) panic("this should not happen, your snprintf is broken"); } strbuf_setlen(sb, sb->len + len); }
int main() { struct strbuf buffer; strbuf_init(&buffer, 0); strbuf_grow(&buffer, 100); print(buffer); strbuf_addchars(&buffer, 'a', 90); print(buffer); strbuf_insert(&buffer, 40, "prince dhaliwal", 15); strbuf_fread(&buffer, 100, stdin); print(buffer); printf("%zd", strbuf_avail(&buffer)); strbuf_release(&buffer); return 0; }
int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term) { int ch; if (feof(fp)) return EOF; strbuf_reset(sb); //flockfile(fp); while ((ch = fgetc(fp)) != EOF) { if (!strbuf_avail(sb)) strbuf_grow(sb, 1); sb->buf[sb->len++] = ch; if (ch == term) break; } //funlockfile(fp); if (ch == EOF && sb->len == 0) return EOF; sb->buf[sb->len] = '\0'; return 0; }