Line Flow Count Block(s) Source
1 - /*
2 - * Copyright (C) the libgit2 contributors. All rights reserved.
3 - *
4 - * This file is part of libgit2, distributed under the GNU GPL v2 with
5 - * a Linking Exception. For full terms see the included COPYING file.
6 - */
7 -
8 - #include "message.h"
9 -
10 231 2 static size_t line_length_without_trailing_spaces(const char *line, size_t len)
11 - {
12 32870 2,7 while (len) {
13 32747 3 unsigned char c = line[len - 1];
14 32747 3,4 if (!git__isspace(c))
15 108 5 break;
16 32639 6 len--;
17 - }
18 -
19 231 8 return len;
20 - }
21 -
22 - /* Greatly inspired from git.git "stripspace" */
23 - /* see https://github.com/git/git/blob/497215d8811ac7b8955693ceaad0899ecd894ed2/builtin/stripspace.c#L4-67 */
24 94 2 int git_message_prettify(git_buf *message_out, const char *message, int strip_comments, char comment_char)
25 - {
26 94 2 const size_t message_len = strlen(message);
27 -
28 94 2 int consecutive_empty_lines = 0;
29 - size_t i, line_length, rtrimmed_line_length;
30 - char *next_newline;
31 -
32 94 2 git_buf_sanitize(message_out);
33 -
34 332 3,19,20 for (i = 0; i < strlen(message); i += line_length) {
35 238 4 next_newline = memchr(message + i, '\n', message_len - i);
36 -
37 238 4 if (next_newline != NULL) {
38 211 5 line_length = next_newline - (message + i) + 1;
39 - } else {
40 27 6 line_length = message_len - i;
41 - }
42 -
43 238 7-9 if (strip_comments && line_length && message[i] == comment_char)
44 7 10 continue;
45 -
46 231 11 rtrimmed_line_length = line_length_without_trailing_spaces(message + i, line_length);
47 -
48 231 12 if (!rtrimmed_line_length) {
49 123 13 consecutive_empty_lines++;
50 123 13 continue;
51 - }
52 -
53 108 14,15 if (consecutive_empty_lines > 0 && message_out->size > 0)
54 13 16 git_buf_putc(message_out, '\n');
55 -
56 108 17 consecutive_empty_lines = 0;
57 108 17 git_buf_put(message_out, message + i, rtrimmed_line_length);
58 108 18 git_buf_putc(message_out, '\n');
59 - }
60 -
61 94 21 return git_buf_oom(message_out) ? -1 : 0;
62 - }