1 #include "cache.h"
2 #include "refs.h"
3 #include "string-list.h"
4 #include "utf8.h"
5 
starts_with(const char * str,const char * prefix)6 int starts_with(const char *str, const char *prefix)
7 {
8 	for (; ; str++, prefix++)
9 		if (!*prefix)
10 			return 1;
11 		else if (*str != *prefix)
12 			return 0;
13 }
14 
istarts_with(const char * str,const char * prefix)15 int istarts_with(const char *str, const char *prefix)
16 {
17 	for (; ; str++, prefix++)
18 		if (!*prefix)
19 			return 1;
20 		else if (tolower(*str) != tolower(*prefix))
21 			return 0;
22 }
23 
skip_to_optional_arg_default(const char * str,const char * prefix,const char ** arg,const char * def)24 int skip_to_optional_arg_default(const char *str, const char *prefix,
25 				 const char **arg, const char *def)
26 {
27 	const char *p;
28 
29 	if (!skip_prefix(str, prefix, &p))
30 		return 0;
31 
32 	if (!*p) {
33 		if (arg)
34 			*arg = def;
35 		return 1;
36 	}
37 
38 	if (*p != '=')
39 		return 0;
40 
41 	if (arg)
42 		*arg = p + 1;
43 	return 1;
44 }
45 
46 /*
47  * Used as the default ->buf value, so that people can always assume
48  * buf is non NULL and ->buf is NUL terminated even for a freshly
49  * initialized strbuf.
50  */
51 char strbuf_slopbuf[1];
52 
strbuf_init(struct strbuf * sb,size_t hint)53 void strbuf_init(struct strbuf *sb, size_t hint)
54 {
55 	sb->alloc = sb->len = 0;
56 	sb->buf = strbuf_slopbuf;
57 	if (hint)
58 		strbuf_grow(sb, hint);
59 }
60 
strbuf_release(struct strbuf * sb)61 void strbuf_release(struct strbuf *sb)
62 {
63 	if (sb->alloc) {
64 		free(sb->buf);
65 		strbuf_init(sb, 0);
66 	}
67 }
68 
strbuf_detach(struct strbuf * sb,size_t * sz)69 char *strbuf_detach(struct strbuf *sb, size_t *sz)
70 {
71 	char *res;
72 	strbuf_grow(sb, 0);
73 	res = sb->buf;
74 	if (sz)
75 		*sz = sb->len;
76 	strbuf_init(sb, 0);
77 	return res;
78 }
79 
strbuf_attach(struct strbuf * sb,void * buf,size_t len,size_t alloc)80 void strbuf_attach(struct strbuf *sb, void *buf, size_t len, size_t alloc)
81 {
82 	strbuf_release(sb);
83 	sb->buf   = buf;
84 	sb->len   = len;
85 	sb->alloc = alloc;
86 	strbuf_grow(sb, 0);
87 	sb->buf[sb->len] = '\0';
88 }
89 
strbuf_grow(struct strbuf * sb,size_t extra)90 void strbuf_grow(struct strbuf *sb, size_t extra)
91 {
92 	int new_buf = !sb->alloc;
93 	if (unsigned_add_overflows(extra, 1) ||
94 	    unsigned_add_overflows(sb->len, extra + 1))
95 		die("you want to use way too much memory");
96 	if (new_buf)
97 		sb->buf = NULL;
98 	ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
99 	if (new_buf)
100 		sb->buf[0] = '\0';
101 }
102 
strbuf_trim(struct strbuf * sb)103 void strbuf_trim(struct strbuf *sb)
104 {
105 	strbuf_rtrim(sb);
106 	strbuf_ltrim(sb);
107 }
108 
strbuf_rtrim(struct strbuf * sb)109 void strbuf_rtrim(struct strbuf *sb)
110 {
111 	while (sb->len > 0 && isspace((unsigned char)sb->buf[sb->len - 1]))
112 		sb->len--;
113 	sb->buf[sb->len] = '\0';
114 }
115 
strbuf_trim_trailing_dir_sep(struct strbuf * sb)116 void strbuf_trim_trailing_dir_sep(struct strbuf *sb)
117 {
118 	while (sb->len > 0 && is_dir_sep((unsigned char)sb->buf[sb->len - 1]))
119 		sb->len--;
120 	sb->buf[sb->len] = '\0';
121 }
122 
strbuf_trim_trailing_newline(struct strbuf * sb)123 void strbuf_trim_trailing_newline(struct strbuf *sb)
124 {
125 	if (sb->len > 0 && sb->buf[sb->len - 1] == '\n') {
126 		if (--sb->len > 0 && sb->buf[sb->len - 1] == '\r')
127 			--sb->len;
128 		sb->buf[sb->len] = '\0';
129 	}
130 }
131 
strbuf_ltrim(struct strbuf * sb)132 void strbuf_ltrim(struct strbuf *sb)
133 {
134 	char *b = sb->buf;
135 	while (sb->len > 0 && isspace(*b)) {
136 		b++;
137 		sb->len--;
138 	}
139 	memmove(sb->buf, b, sb->len);
140 	sb->buf[sb->len] = '\0';
141 }
142 
strbuf_reencode(struct strbuf * sb,const char * from,const char * to)143 int strbuf_reencode(struct strbuf *sb, const char *from, const char *to)
144 {
145 	char *out;
146 	size_t len;
147 
148 	if (same_encoding(from, to))
149 		return 0;
150 
151 	out = reencode_string_len(sb->buf, sb->len, to, from, &len);
152 	if (!out)
153 		return -1;
154 
155 	strbuf_attach(sb, out, len, len);
156 	return 0;
157 }
158 
strbuf_tolower(struct strbuf * sb)159 void strbuf_tolower(struct strbuf *sb)
160 {
161 	char *p = sb->buf, *end = sb->buf + sb->len;
162 	for (; p < end; p++)
163 		*p = tolower(*p);
164 }
165 
strbuf_split_buf(const char * str,size_t slen,int terminator,int max)166 struct strbuf **strbuf_split_buf(const char *str, size_t slen,
167 				 int terminator, int max)
168 {
169 	struct strbuf **ret = NULL;
170 	size_t nr = 0, alloc = 0;
171 	struct strbuf *t;
172 
173 	while (slen) {
174 		int len = slen;
175 		if (max <= 0 || nr + 1 < max) {
176 			const char *end = memchr(str, terminator, slen);
177 			if (end)
178 				len = end - str + 1;
179 		}
180 		t = xmalloc(sizeof(struct strbuf));
181 		strbuf_init(t, len);
182 		strbuf_add(t, str, len);
183 		ALLOC_GROW(ret, nr + 2, alloc);
184 		ret[nr++] = t;
185 		str += len;
186 		slen -= len;
187 	}
188 	ALLOC_GROW(ret, nr + 1, alloc); /* In case string was empty */
189 	ret[nr] = NULL;
190 	return ret;
191 }
192 
strbuf_add_separated_string_list(struct strbuf * str,const char * sep,struct string_list * slist)193 void strbuf_add_separated_string_list(struct strbuf *str,
194 				      const char *sep,
195 				      struct string_list *slist)
196 {
197 	struct string_list_item *item;
198 	int sep_needed = 0;
199 
200 	for_each_string_list_item(item, slist) {
201 		if (sep_needed)
202 			strbuf_addstr(str, sep);
203 		strbuf_addstr(str, item->string);
204 		sep_needed = 1;
205 	}
206 }
207 
strbuf_list_free(struct strbuf ** sbs)208 void strbuf_list_free(struct strbuf **sbs)
209 {
210 	struct strbuf **s = sbs;
211 
212 	while (*s) {
213 		strbuf_release(*s);
214 		free(*s++);
215 	}
216 	free(sbs);
217 }
218 
strbuf_cmp(const struct strbuf * a,const struct strbuf * b)219 int strbuf_cmp(const struct strbuf *a, const struct strbuf *b)
220 {
221 	size_t len = a->len < b->len ? a->len: b->len;
222 	int cmp = memcmp(a->buf, b->buf, len);
223 	if (cmp)
224 		return cmp;
225 	return a->len < b->len ? -1: a->len != b->len;
226 }
227 
strbuf_splice(struct strbuf * sb,size_t pos,size_t len,const void * data,size_t dlen)228 void strbuf_splice(struct strbuf *sb, size_t pos, size_t len,
229 				   const void *data, size_t dlen)
230 {
231 	if (unsigned_add_overflows(pos, len))
232 		die("you want to use way too much memory");
233 	if (pos > sb->len)
234 		die("`pos' is too far after the end of the buffer");
235 	if (pos + len > sb->len)
236 		die("`pos + len' is too far after the end of the buffer");
237 
238 	if (dlen >= len)
239 		strbuf_grow(sb, dlen - len);
240 	memmove(sb->buf + pos + dlen,
241 			sb->buf + pos + len,
242 			sb->len - pos - len);
243 	memcpy(sb->buf + pos, data, dlen);
244 	strbuf_setlen(sb, sb->len + dlen - len);
245 }
246 
strbuf_insert(struct strbuf * sb,size_t pos,const void * data,size_t len)247 void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len)
248 {
249 	strbuf_splice(sb, pos, 0, data, len);
250 }
251 
strbuf_vinsertf(struct strbuf * sb,size_t pos,const char * fmt,va_list ap)252 void strbuf_vinsertf(struct strbuf *sb, size_t pos, const char *fmt, va_list ap)
253 {
254 	int len, len2;
255 	char save;
256 	va_list cp;
257 
258 	if (pos > sb->len)
259 		die("`pos' is too far after the end of the buffer");
260 	va_copy(cp, ap);
261 	len = vsnprintf(sb->buf + sb->len, 0, fmt, cp);
262 	va_end(cp);
263 	if (len < 0)
264 		BUG("your vsnprintf is broken (returned %d)", len);
265 	if (!len)
266 		return; /* nothing to do */
267 	if (unsigned_add_overflows(sb->len, len))
268 		die("you want to use way too much memory");
269 	strbuf_grow(sb, len);
270 	memmove(sb->buf + pos + len, sb->buf + pos, sb->len - pos);
271 	/* vsnprintf() will append a NUL, overwriting one of our characters */
272 	save = sb->buf[pos + len];
273 	len2 = vsnprintf(sb->buf + pos, len + 1, fmt, ap);
274 	sb->buf[pos + len] = save;
275 	if (len2 != len)
276 		BUG("your vsnprintf is broken (returns inconsistent lengths)");
277 	strbuf_setlen(sb, sb->len + len);
278 }
279 
strbuf_insertf(struct strbuf * sb,size_t pos,const char * fmt,...)280 void strbuf_insertf(struct strbuf *sb, size_t pos, const char *fmt, ...)
281 {
282 	va_list ap;
283 	va_start(ap, fmt);
284 	strbuf_vinsertf(sb, pos, fmt, ap);
285 	va_end(ap);
286 }
287 
strbuf_remove(struct strbuf * sb,size_t pos,size_t len)288 void strbuf_remove(struct strbuf *sb, size_t pos, size_t len)
289 {
290 	strbuf_splice(sb, pos, len, "", 0);
291 }
292 
strbuf_add(struct strbuf * sb,const void * data,size_t len)293 void strbuf_add(struct strbuf *sb, const void *data, size_t len)
294 {
295 	strbuf_grow(sb, len);
296 	memcpy(sb->buf + sb->len, data, len);
297 	strbuf_setlen(sb, sb->len + len);
298 }
299 
strbuf_addbuf(struct strbuf * sb,const struct strbuf * sb2)300 void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2)
301 {
302 	strbuf_grow(sb, sb2->len);
303 	memcpy(sb->buf + sb->len, sb2->buf, sb2->len);
304 	strbuf_setlen(sb, sb->len + sb2->len);
305 }
306 
strbuf_join_argv(struct strbuf * buf,int argc,const char ** argv,char delim)307 const char *strbuf_join_argv(struct strbuf *buf,
308 			     int argc, const char **argv, char delim)
309 {
310 	if (!argc)
311 		return buf->buf;
312 
313 	strbuf_addstr(buf, *argv);
314 	while (--argc) {
315 		strbuf_addch(buf, delim);
316 		strbuf_addstr(buf, *(++argv));
317 	}
318 
319 	return buf->buf;
320 }
321 
strbuf_addchars(struct strbuf * sb,int c,size_t n)322 void strbuf_addchars(struct strbuf *sb, int c, size_t n)
323 {
324 	strbuf_grow(sb, n);
325 	memset(sb->buf + sb->len, c, n);
326 	strbuf_setlen(sb, sb->len + n);
327 }
328 
strbuf_addf(struct strbuf * sb,const char * fmt,...)329 void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
330 {
331 	va_list ap;
332 	va_start(ap, fmt);
333 	strbuf_vaddf(sb, fmt, ap);
334 	va_end(ap);
335 }
336 
add_lines(struct strbuf * out,const char * prefix1,const char * prefix2,const char * buf,size_t size)337 static void add_lines(struct strbuf *out,
338 			const char *prefix1,
339 			const char *prefix2,
340 			const char *buf, size_t size)
341 {
342 	while (size) {
343 		const char *prefix;
344 		const char *next = memchr(buf, '\n', size);
345 		next = next ? (next + 1) : (buf + size);
346 
347 		prefix = ((prefix2 && (buf[0] == '\n' || buf[0] == '\t'))
348 			  ? prefix2 : prefix1);
349 		strbuf_addstr(out, prefix);
350 		strbuf_add(out, buf, next - buf);
351 		size -= next - buf;
352 		buf = next;
353 	}
354 	strbuf_complete_line(out);
355 }
356 
strbuf_add_commented_lines(struct strbuf * out,const char * buf,size_t size)357 void strbuf_add_commented_lines(struct strbuf *out, const char *buf, size_t size)
358 {
359 	static char prefix1[3];
360 	static char prefix2[2];
361 
362 	if (prefix1[0] != comment_line_char) {
363 		xsnprintf(prefix1, sizeof(prefix1), "%c ", comment_line_char);
364 		xsnprintf(prefix2, sizeof(prefix2), "%c", comment_line_char);
365 	}
366 	add_lines(out, prefix1, prefix2, buf, size);
367 }
368 
strbuf_commented_addf(struct strbuf * sb,const char * fmt,...)369 void strbuf_commented_addf(struct strbuf *sb, const char *fmt, ...)
370 {
371 	va_list params;
372 	struct strbuf buf = STRBUF_INIT;
373 	int incomplete_line = sb->len && sb->buf[sb->len - 1] != '\n';
374 
375 	va_start(params, fmt);
376 	strbuf_vaddf(&buf, fmt, params);
377 	va_end(params);
378 
379 	strbuf_add_commented_lines(sb, buf.buf, buf.len);
380 	if (incomplete_line)
381 		sb->buf[--sb->len] = '\0';
382 
383 	strbuf_release(&buf);
384 }
385 
strbuf_vaddf(struct strbuf * sb,const char * fmt,va_list ap)386 void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap)
387 {
388 	int len;
389 	va_list cp;
390 
391 	if (!strbuf_avail(sb))
392 		strbuf_grow(sb, 64);
393 	va_copy(cp, ap);
394 	len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, cp);
395 	va_end(cp);
396 	if (len < 0)
397 		BUG("your vsnprintf is broken (returned %d)", len);
398 	if (len > strbuf_avail(sb)) {
399 		strbuf_grow(sb, len);
400 		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
401 		if (len > strbuf_avail(sb))
402 			BUG("your vsnprintf is broken (insatiable)");
403 	}
404 	strbuf_setlen(sb, sb->len + len);
405 }
406 
strbuf_expand(struct strbuf * sb,const char * format,expand_fn_t fn,void * context)407 void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn,
408 		   void *context)
409 {
410 	for (;;) {
411 		const char *percent;
412 		size_t consumed;
413 
414 		percent = strchrnul(format, '%');
415 		strbuf_add(sb, format, percent - format);
416 		if (!*percent)
417 			break;
418 		format = percent + 1;
419 
420 		if (*format == '%') {
421 			strbuf_addch(sb, '%');
422 			format++;
423 			continue;
424 		}
425 
426 		consumed = fn(sb, format, context);
427 		if (consumed)
428 			format += consumed;
429 		else
430 			strbuf_addch(sb, '%');
431 	}
432 }
433 
strbuf_expand_literal_cb(struct strbuf * sb,const char * placeholder,void * context)434 size_t strbuf_expand_literal_cb(struct strbuf *sb,
435 				const char *placeholder,
436 				void *context)
437 {
438 	int ch;
439 
440 	switch (placeholder[0]) {
441 	case 'n':		/* newline */
442 		strbuf_addch(sb, '\n');
443 		return 1;
444 	case 'x':
445 		/* %x00 == NUL, %x0a == LF, etc. */
446 		ch = hex2chr(placeholder + 1);
447 		if (ch < 0)
448 			return 0;
449 		strbuf_addch(sb, ch);
450 		return 3;
451 	}
452 	return 0;
453 }
454 
strbuf_expand_dict_cb(struct strbuf * sb,const char * placeholder,void * context)455 size_t strbuf_expand_dict_cb(struct strbuf *sb, const char *placeholder,
456 		void *context)
457 {
458 	struct strbuf_expand_dict_entry *e = context;
459 	size_t len;
460 
461 	for (; e->placeholder && (len = strlen(e->placeholder)); e++) {
462 		if (!strncmp(placeholder, e->placeholder, len)) {
463 			if (e->value)
464 				strbuf_addstr(sb, e->value);
465 			return len;
466 		}
467 	}
468 	return 0;
469 }
470 
strbuf_addbuf_percentquote(struct strbuf * dst,const struct strbuf * src)471 void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src)
472 {
473 	size_t i, len = src->len;
474 
475 	for (i = 0; i < len; i++) {
476 		if (src->buf[i] == '%')
477 			strbuf_addch(dst, '%');
478 		strbuf_addch(dst, src->buf[i]);
479 	}
480 }
481 
strbuf_fread(struct strbuf * sb,size_t size,FILE * f)482 size_t strbuf_fread(struct strbuf *sb, size_t size, FILE *f)
483 {
484 	size_t res;
485 	size_t oldalloc = sb->alloc;
486 
487 	strbuf_grow(sb, size);
488 	res = fread(sb->buf + sb->len, 1, size, f);
489 	if (res > 0)
490 		strbuf_setlen(sb, sb->len + res);
491 	else if (oldalloc == 0)
492 		strbuf_release(sb);
493 	return res;
494 }
495 
strbuf_read(struct strbuf * sb,int fd,size_t hint)496 ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint)
497 {
498 	size_t oldlen = sb->len;
499 	size_t oldalloc = sb->alloc;
500 
501 	strbuf_grow(sb, hint ? hint : 8192);
502 	for (;;) {
503 		ssize_t want = sb->alloc - sb->len - 1;
504 		ssize_t got = read_in_full(fd, sb->buf + sb->len, want);
505 
506 		if (got < 0) {
507 			if (oldalloc == 0)
508 				strbuf_release(sb);
509 			else
510 				strbuf_setlen(sb, oldlen);
511 			return -1;
512 		}
513 		sb->len += got;
514 		if (got < want)
515 			break;
516 		strbuf_grow(sb, 8192);
517 	}
518 
519 	sb->buf[sb->len] = '\0';
520 	return sb->len - oldlen;
521 }
522 
strbuf_read_once(struct strbuf * sb,int fd,size_t hint)523 ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint)
524 {
525 	size_t oldalloc = sb->alloc;
526 	ssize_t cnt;
527 
528 	strbuf_grow(sb, hint ? hint : 8192);
529 	cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1);
530 	if (cnt > 0)
531 		strbuf_setlen(sb, sb->len + cnt);
532 	else if (oldalloc == 0)
533 		strbuf_release(sb);
534 	return cnt;
535 }
536 
strbuf_write(struct strbuf * sb,FILE * f)537 ssize_t strbuf_write(struct strbuf *sb, FILE *f)
538 {
539 	return sb->len ? fwrite(sb->buf, 1, sb->len, f) : 0;
540 }
541 
542 
543 #define STRBUF_MAXLINK (2*PATH_MAX)
544 
strbuf_readlink(struct strbuf * sb,const char * path,size_t hint)545 int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
546 {
547 	size_t oldalloc = sb->alloc;
548 
549 	if (hint < 32)
550 		hint = 32;
551 
552 	while (hint < STRBUF_MAXLINK) {
553 		ssize_t len;
554 
555 		strbuf_grow(sb, hint);
556 		len = readlink(path, sb->buf, hint);
557 		if (len < 0) {
558 			if (errno != ERANGE)
559 				break;
560 		} else if (len < hint) {
561 			strbuf_setlen(sb, len);
562 			return 0;
563 		}
564 
565 		/* .. the buffer was too small - try again */
566 		hint *= 2;
567 	}
568 	if (oldalloc == 0)
569 		strbuf_release(sb);
570 	return -1;
571 }
572 
strbuf_getcwd(struct strbuf * sb)573 int strbuf_getcwd(struct strbuf *sb)
574 {
575 	size_t oldalloc = sb->alloc;
576 	size_t guessed_len = 128;
577 
578 	for (;; guessed_len *= 2) {
579 		strbuf_grow(sb, guessed_len);
580 		if (getcwd(sb->buf, sb->alloc)) {
581 			strbuf_setlen(sb, strlen(sb->buf));
582 			return 0;
583 		}
584 
585 		/*
586 		 * If getcwd(3) is implemented as a syscall that falls
587 		 * back to a regular lookup using readdir(3) etc. then
588 		 * we may be able to avoid EACCES by providing enough
589 		 * space to the syscall as it's not necessarily bound
590 		 * to the same restrictions as the fallback.
591 		 */
592 		if (errno == EACCES && guessed_len < PATH_MAX)
593 			continue;
594 
595 		if (errno != ERANGE)
596 			break;
597 	}
598 	if (oldalloc == 0)
599 		strbuf_release(sb);
600 	else
601 		strbuf_reset(sb);
602 	return -1;
603 }
604 
605 #ifdef HAVE_GETDELIM
strbuf_getwholeline(struct strbuf * sb,FILE * fp,int term)606 int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
607 {
608 	ssize_t r;
609 
610 	if (feof(fp))
611 		return EOF;
612 
613 	strbuf_reset(sb);
614 
615 	/* Translate slopbuf to NULL, as we cannot call realloc on it */
616 	if (!sb->alloc)
617 		sb->buf = NULL;
618 	errno = 0;
619 	r = getdelim(&sb->buf, &sb->alloc, term, fp);
620 
621 	if (r > 0) {
622 		sb->len = r;
623 		return 0;
624 	}
625 	assert(r == -1);
626 
627 	/*
628 	 * Normally we would have called xrealloc, which will try to free
629 	 * memory and recover. But we have no way to tell getdelim() to do so.
630 	 * Worse, we cannot try to recover ENOMEM ourselves, because we have
631 	 * no idea how many bytes were read by getdelim.
632 	 *
633 	 * Dying here is reasonable. It mirrors what xrealloc would do on
634 	 * catastrophic memory failure. We skip the opportunity to free pack
635 	 * memory and retry, but that's unlikely to help for a malloc small
636 	 * enough to hold a single line of input, anyway.
637 	 */
638 	if (errno == ENOMEM)
639 		die("Out of memory, getdelim failed");
640 
641 	/*
642 	 * Restore strbuf invariants; if getdelim left us with a NULL pointer,
643 	 * we can just re-init, but otherwise we should make sure that our
644 	 * length is empty, and that the result is NUL-terminated.
645 	 */
646 	if (!sb->buf)
647 		strbuf_init(sb, 0);
648 	else
649 		strbuf_reset(sb);
650 	return EOF;
651 }
652 #else
strbuf_getwholeline(struct strbuf * sb,FILE * fp,int term)653 int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
654 {
655 	int ch;
656 
657 	if (feof(fp))
658 		return EOF;
659 
660 	strbuf_reset(sb);
661 	flockfile(fp);
662 	while ((ch = getc_unlocked(fp)) != EOF) {
663 		if (!strbuf_avail(sb))
664 			strbuf_grow(sb, 1);
665 		sb->buf[sb->len++] = ch;
666 		if (ch == term)
667 			break;
668 	}
669 	funlockfile(fp);
670 	if (ch == EOF && sb->len == 0)
671 		return EOF;
672 
673 	sb->buf[sb->len] = '\0';
674 	return 0;
675 }
676 #endif
677 
strbuf_getdelim(struct strbuf * sb,FILE * fp,int term)678 static int strbuf_getdelim(struct strbuf *sb, FILE *fp, int term)
679 {
680 	if (strbuf_getwholeline(sb, fp, term))
681 		return EOF;
682 	if (sb->buf[sb->len - 1] == term)
683 		strbuf_setlen(sb, sb->len - 1);
684 	return 0;
685 }
686 
strbuf_getline(struct strbuf * sb,FILE * fp)687 int strbuf_getline(struct strbuf *sb, FILE *fp)
688 {
689 	if (strbuf_getwholeline(sb, fp, '\n'))
690 		return EOF;
691 	if (sb->buf[sb->len - 1] == '\n') {
692 		strbuf_setlen(sb, sb->len - 1);
693 		if (sb->len && sb->buf[sb->len - 1] == '\r')
694 			strbuf_setlen(sb, sb->len - 1);
695 	}
696 	return 0;
697 }
698 
strbuf_getline_lf(struct strbuf * sb,FILE * fp)699 int strbuf_getline_lf(struct strbuf *sb, FILE *fp)
700 {
701 	return strbuf_getdelim(sb, fp, '\n');
702 }
703 
strbuf_getline_nul(struct strbuf * sb,FILE * fp)704 int strbuf_getline_nul(struct strbuf *sb, FILE *fp)
705 {
706 	return strbuf_getdelim(sb, fp, '\0');
707 }
708 
strbuf_getwholeline_fd(struct strbuf * sb,int fd,int term)709 int strbuf_getwholeline_fd(struct strbuf *sb, int fd, int term)
710 {
711 	strbuf_reset(sb);
712 
713 	while (1) {
714 		char ch;
715 		ssize_t len = xread(fd, &ch, 1);
716 		if (len <= 0)
717 			return EOF;
718 		strbuf_addch(sb, ch);
719 		if (ch == term)
720 			break;
721 	}
722 	return 0;
723 }
724 
strbuf_read_file(struct strbuf * sb,const char * path,size_t hint)725 ssize_t strbuf_read_file(struct strbuf *sb, const char *path, size_t hint)
726 {
727 	int fd;
728 	ssize_t len;
729 	int saved_errno;
730 
731 	fd = open(path, O_RDONLY);
732 	if (fd < 0)
733 		return -1;
734 	len = strbuf_read(sb, fd, hint);
735 	saved_errno = errno;
736 	close(fd);
737 	if (len < 0) {
738 		errno = saved_errno;
739 		return -1;
740 	}
741 
742 	return len;
743 }
744 
strbuf_add_lines(struct strbuf * out,const char * prefix,const char * buf,size_t size)745 void strbuf_add_lines(struct strbuf *out, const char *prefix,
746 		      const char *buf, size_t size)
747 {
748 	add_lines(out, prefix, NULL, buf, size);
749 }
750 
strbuf_addstr_xml_quoted(struct strbuf * buf,const char * s)751 void strbuf_addstr_xml_quoted(struct strbuf *buf, const char *s)
752 {
753 	while (*s) {
754 		size_t len = strcspn(s, "\"<>&");
755 		strbuf_add(buf, s, len);
756 		s += len;
757 		switch (*s) {
758 		case '"':
759 			strbuf_addstr(buf, "&quot;");
760 			break;
761 		case '<':
762 			strbuf_addstr(buf, "&lt;");
763 			break;
764 		case '>':
765 			strbuf_addstr(buf, "&gt;");
766 			break;
767 		case '&':
768 			strbuf_addstr(buf, "&amp;");
769 			break;
770 		case 0:
771 			return;
772 		}
773 		s++;
774 	}
775 }
776 
is_rfc3986_reserved_or_unreserved(char ch)777 int is_rfc3986_reserved_or_unreserved(char ch)
778 {
779 	if (is_rfc3986_unreserved(ch))
780 		return 1;
781 	switch (ch) {
782 		case '!': case '*': case '\'': case '(': case ')': case ';':
783 		case ':': case '@': case '&': case '=': case '+': case '$':
784 		case ',': case '/': case '?': case '#': case '[': case ']':
785 			return 1;
786 	}
787 	return 0;
788 }
789 
is_rfc3986_unreserved(char ch)790 int is_rfc3986_unreserved(char ch)
791 {
792 	return isalnum(ch) ||
793 		ch == '-' || ch == '_' || ch == '.' || ch == '~';
794 }
795 
strbuf_add_urlencode(struct strbuf * sb,const char * s,size_t len,char_predicate allow_unencoded_fn)796 static void strbuf_add_urlencode(struct strbuf *sb, const char *s, size_t len,
797 				 char_predicate allow_unencoded_fn)
798 {
799 	strbuf_grow(sb, len);
800 	while (len--) {
801 		char ch = *s++;
802 		if (allow_unencoded_fn(ch))
803 			strbuf_addch(sb, ch);
804 		else
805 			strbuf_addf(sb, "%%%02x", (unsigned char)ch);
806 	}
807 }
808 
strbuf_addstr_urlencode(struct strbuf * sb,const char * s,char_predicate allow_unencoded_fn)809 void strbuf_addstr_urlencode(struct strbuf *sb, const char *s,
810 			     char_predicate allow_unencoded_fn)
811 {
812 	strbuf_add_urlencode(sb, s, strlen(s), allow_unencoded_fn);
813 }
814 
strbuf_humanise(struct strbuf * buf,off_t bytes,int humanise_rate)815 static void strbuf_humanise(struct strbuf *buf, off_t bytes,
816 				 int humanise_rate)
817 {
818 	if (bytes > 1 << 30) {
819 		strbuf_addf(buf,
820 				humanise_rate == 0 ?
821 					/* TRANSLATORS: IEC 80000-13:2008 gibibyte */
822 					_("%u.%2.2u GiB") :
823 					/* TRANSLATORS: IEC 80000-13:2008 gibibyte/second */
824 					_("%u.%2.2u GiB/s"),
825 			    (unsigned)(bytes >> 30),
826 			    (unsigned)(bytes & ((1 << 30) - 1)) / 10737419);
827 	} else if (bytes > 1 << 20) {
828 		unsigned x = bytes + 5243;  /* for rounding */
829 		strbuf_addf(buf,
830 				humanise_rate == 0 ?
831 					/* TRANSLATORS: IEC 80000-13:2008 mebibyte */
832 					_("%u.%2.2u MiB") :
833 					/* TRANSLATORS: IEC 80000-13:2008 mebibyte/second */
834 					_("%u.%2.2u MiB/s"),
835 			    x >> 20, ((x & ((1 << 20) - 1)) * 100) >> 20);
836 	} else if (bytes > 1 << 10) {
837 		unsigned x = bytes + 5;  /* for rounding */
838 		strbuf_addf(buf,
839 				humanise_rate == 0 ?
840 					/* TRANSLATORS: IEC 80000-13:2008 kibibyte */
841 					_("%u.%2.2u KiB") :
842 					/* TRANSLATORS: IEC 80000-13:2008 kibibyte/second */
843 					_("%u.%2.2u KiB/s"),
844 			    x >> 10, ((x & ((1 << 10) - 1)) * 100) >> 10);
845 	} else {
846 		strbuf_addf(buf,
847 				humanise_rate == 0 ?
848 					/* TRANSLATORS: IEC 80000-13:2008 byte */
849 					Q_("%u byte", "%u bytes", (unsigned)bytes) :
850 					/* TRANSLATORS: IEC 80000-13:2008 byte/second */
851 					Q_("%u byte/s", "%u bytes/s", (unsigned)bytes),
852 				(unsigned)bytes);
853 	}
854 }
855 
strbuf_humanise_bytes(struct strbuf * buf,off_t bytes)856 void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes)
857 {
858 	strbuf_humanise(buf, bytes, 0);
859 }
860 
strbuf_humanise_rate(struct strbuf * buf,off_t bytes)861 void strbuf_humanise_rate(struct strbuf *buf, off_t bytes)
862 {
863 	strbuf_humanise(buf, bytes, 1);
864 }
865 
strbuf_add_absolute_path(struct strbuf * sb,const char * path)866 void strbuf_add_absolute_path(struct strbuf *sb, const char *path)
867 {
868 	if (!*path)
869 		die("The empty string is not a valid path");
870 	if (!is_absolute_path(path)) {
871 		struct stat cwd_stat, pwd_stat;
872 		size_t orig_len = sb->len;
873 		char *cwd = xgetcwd();
874 		char *pwd = getenv("PWD");
875 		if (pwd && strcmp(pwd, cwd) &&
876 		    !stat(cwd, &cwd_stat) &&
877 		    (cwd_stat.st_dev || cwd_stat.st_ino) &&
878 		    !stat(pwd, &pwd_stat) &&
879 		    pwd_stat.st_dev == cwd_stat.st_dev &&
880 		    pwd_stat.st_ino == cwd_stat.st_ino)
881 			strbuf_addstr(sb, pwd);
882 		else
883 			strbuf_addstr(sb, cwd);
884 		if (sb->len > orig_len && !is_dir_sep(sb->buf[sb->len - 1]))
885 			strbuf_addch(sb, '/');
886 		free(cwd);
887 	}
888 	strbuf_addstr(sb, path);
889 }
890 
strbuf_add_real_path(struct strbuf * sb,const char * path)891 void strbuf_add_real_path(struct strbuf *sb, const char *path)
892 {
893 	if (sb->len) {
894 		struct strbuf resolved = STRBUF_INIT;
895 		strbuf_realpath(&resolved, path, 1);
896 		strbuf_addbuf(sb, &resolved);
897 		strbuf_release(&resolved);
898 	} else
899 		strbuf_realpath(sb, path, 1);
900 }
901 
printf_ln(const char * fmt,...)902 int printf_ln(const char *fmt, ...)
903 {
904 	int ret;
905 	va_list ap;
906 	va_start(ap, fmt);
907 	ret = vprintf(fmt, ap);
908 	va_end(ap);
909 	if (ret < 0 || putchar('\n') == EOF)
910 		return -1;
911 	return ret + 1;
912 }
913 
fprintf_ln(FILE * fp,const char * fmt,...)914 int fprintf_ln(FILE *fp, const char *fmt, ...)
915 {
916 	int ret;
917 	va_list ap;
918 	va_start(ap, fmt);
919 	ret = vfprintf(fp, fmt, ap);
920 	va_end(ap);
921 	if (ret < 0 || putc('\n', fp) == EOF)
922 		return -1;
923 	return ret + 1;
924 }
925 
xstrdup_tolower(const char * string)926 char *xstrdup_tolower(const char *string)
927 {
928 	char *result;
929 	size_t len, i;
930 
931 	len = strlen(string);
932 	result = xmallocz(len);
933 	for (i = 0; i < len; i++)
934 		result[i] = tolower(string[i]);
935 	return result;
936 }
937 
xstrdup_toupper(const char * string)938 char *xstrdup_toupper(const char *string)
939 {
940 	char *result;
941 	size_t len, i;
942 
943 	len = strlen(string);
944 	result = xmallocz(len);
945 	for (i = 0; i < len; i++)
946 		result[i] = toupper(string[i]);
947 	return result;
948 }
949 
xstrvfmt(const char * fmt,va_list ap)950 char *xstrvfmt(const char *fmt, va_list ap)
951 {
952 	struct strbuf buf = STRBUF_INIT;
953 	strbuf_vaddf(&buf, fmt, ap);
954 	return strbuf_detach(&buf, NULL);
955 }
956 
xstrfmt(const char * fmt,...)957 char *xstrfmt(const char *fmt, ...)
958 {
959 	va_list ap;
960 	char *ret;
961 
962 	va_start(ap, fmt);
963 	ret = xstrvfmt(fmt, ap);
964 	va_end(ap);
965 
966 	return ret;
967 }
968 
strbuf_addftime(struct strbuf * sb,const char * fmt,const struct tm * tm,int tz_offset,int suppress_tz_name)969 void strbuf_addftime(struct strbuf *sb, const char *fmt, const struct tm *tm,
970 		     int tz_offset, int suppress_tz_name)
971 {
972 	struct strbuf munged_fmt = STRBUF_INIT;
973 	size_t hint = 128;
974 	size_t len;
975 
976 	if (!*fmt)
977 		return;
978 
979 	/*
980 	 * There is no portable way to pass timezone information to
981 	 * strftime, so we handle %z and %Z here.
982 	 */
983 	for (;;) {
984 		const char *percent = strchrnul(fmt, '%');
985 		strbuf_add(&munged_fmt, fmt, percent - fmt);
986 		if (!*percent)
987 			break;
988 		fmt = percent + 1;
989 		switch (*fmt) {
990 		case '%':
991 			strbuf_addstr(&munged_fmt, "%%");
992 			fmt++;
993 			break;
994 		case 'z':
995 			strbuf_addf(&munged_fmt, "%+05d", tz_offset);
996 			fmt++;
997 			break;
998 		case 'Z':
999 			if (suppress_tz_name) {
1000 				fmt++;
1001 				break;
1002 			}
1003 			/* FALLTHROUGH */
1004 		default:
1005 			strbuf_addch(&munged_fmt, '%');
1006 		}
1007 	}
1008 	fmt = munged_fmt.buf;
1009 
1010 	strbuf_grow(sb, hint);
1011 	len = strftime(sb->buf + sb->len, sb->alloc - sb->len, fmt, tm);
1012 
1013 	if (!len) {
1014 		/*
1015 		 * strftime reports "0" if it could not fit the result in the buffer.
1016 		 * Unfortunately, it also reports "0" if the requested time string
1017 		 * takes 0 bytes. So our strategy is to munge the format so that the
1018 		 * output contains at least one character, and then drop the extra
1019 		 * character before returning.
1020 		 */
1021 		strbuf_addch(&munged_fmt, ' ');
1022 		while (!len) {
1023 			hint *= 2;
1024 			strbuf_grow(sb, hint);
1025 			len = strftime(sb->buf + sb->len, sb->alloc - sb->len,
1026 				       munged_fmt.buf, tm);
1027 		}
1028 		len--; /* drop munged space */
1029 	}
1030 	strbuf_release(&munged_fmt);
1031 	strbuf_setlen(sb, sb->len + len);
1032 }
1033 
strbuf_add_unique_abbrev(struct strbuf * sb,const struct object_id * oid,int abbrev_len)1034 void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid,
1035 			      int abbrev_len)
1036 {
1037 	int r;
1038 	strbuf_grow(sb, GIT_MAX_HEXSZ + 1);
1039 	r = find_unique_abbrev_r(sb->buf + sb->len, oid, abbrev_len);
1040 	strbuf_setlen(sb, sb->len + r);
1041 }
1042 
1043 /*
1044  * Returns the length of a line, without trailing spaces.
1045  *
1046  * If the line ends with newline, it will be removed too.
1047  */
cleanup(char * line,size_t len)1048 static size_t cleanup(char *line, size_t len)
1049 {
1050 	while (len) {
1051 		unsigned char c = line[len - 1];
1052 		if (!isspace(c))
1053 			break;
1054 		len--;
1055 	}
1056 
1057 	return len;
1058 }
1059 
1060 /*
1061  * Remove empty lines from the beginning and end
1062  * and also trailing spaces from every line.
1063  *
1064  * Turn multiple consecutive empty lines between paragraphs
1065  * into just one empty line.
1066  *
1067  * If the input has only empty lines and spaces,
1068  * no output will be produced.
1069  *
1070  * If last line does not have a newline at the end, one is added.
1071  *
1072  * Enable skip_comments to skip every line starting with comment
1073  * character.
1074  */
strbuf_stripspace(struct strbuf * sb,int skip_comments)1075 void strbuf_stripspace(struct strbuf *sb, int skip_comments)
1076 {
1077 	size_t empties = 0;
1078 	size_t i, j, len, newlen;
1079 	char *eol;
1080 
1081 	/* We may have to add a newline. */
1082 	strbuf_grow(sb, 1);
1083 
1084 	for (i = j = 0; i < sb->len; i += len, j += newlen) {
1085 		eol = memchr(sb->buf + i, '\n', sb->len - i);
1086 		len = eol ? eol - (sb->buf + i) + 1 : sb->len - i;
1087 
1088 		if (skip_comments && len && sb->buf[i] == comment_line_char) {
1089 			newlen = 0;
1090 			continue;
1091 		}
1092 		newlen = cleanup(sb->buf + i, len);
1093 
1094 		/* Not just an empty line? */
1095 		if (newlen) {
1096 			if (empties > 0 && j > 0)
1097 				sb->buf[j++] = '\n';
1098 			empties = 0;
1099 			memmove(sb->buf + j, sb->buf + i, newlen);
1100 			sb->buf[newlen + j++] = '\n';
1101 		} else {
1102 			empties++;
1103 		}
1104 	}
1105 
1106 	strbuf_setlen(sb, j);
1107 }
1108 
strbuf_normalize_path(struct strbuf * src)1109 int strbuf_normalize_path(struct strbuf *src)
1110 {
1111 	struct strbuf dst = STRBUF_INIT;
1112 
1113 	strbuf_grow(&dst, src->len);
1114 	if (normalize_path_copy(dst.buf, src->buf) < 0) {
1115 		strbuf_release(&dst);
1116 		return -1;
1117 	}
1118 
1119 	/*
1120 	 * normalize_path does not tell us the new length, so we have to
1121 	 * compute it by looking for the new NUL it placed
1122 	 */
1123 	strbuf_setlen(&dst, strlen(dst.buf));
1124 	strbuf_swap(src, &dst);
1125 	strbuf_release(&dst);
1126 	return 0;
1127 }
1128 
strbuf_edit_interactively(struct strbuf * buffer,const char * path,const char * const * env)1129 int strbuf_edit_interactively(struct strbuf *buffer, const char *path,
1130 			      const char *const *env)
1131 {
1132 	char *path2 = NULL;
1133 	int fd, res = 0;
1134 
1135 	if (!is_absolute_path(path))
1136 		path = path2 = xstrdup(git_path("%s", path));
1137 
1138 	fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
1139 	if (fd < 0)
1140 		res = error_errno(_("could not open '%s' for writing"), path);
1141 	else if (write_in_full(fd, buffer->buf, buffer->len) < 0) {
1142 		res = error_errno(_("could not write to '%s'"), path);
1143 		close(fd);
1144 	} else if (close(fd) < 0)
1145 		res = error_errno(_("could not close '%s'"), path);
1146 	else {
1147 		strbuf_reset(buffer);
1148 		if (launch_editor(path, buffer, env) < 0)
1149 			res = error_errno(_("could not edit '%s'"), path);
1150 		unlink(path);
1151 	}
1152 
1153 	free(path2);
1154 	return res;
1155 }
1156