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 - #include "parse.h"
8 -
9 23780 2 int git_parse_ctx_init(git_parse_ctx *ctx, const char *content, size_t content_len)
10 - {
11 23780 2,3 if (content && content_len) {
12 22905 4 ctx->content = content;
13 22905 4 ctx->content_len = content_len;
14 - } else {
15 875 5 ctx->content = "";
16 875 5 ctx->content_len = 0;
17 - }
18 -
19 23780 6 ctx->remain = ctx->content;
20 23780 6 ctx->remain_len = ctx->content_len;
21 23780 6 ctx->line = ctx->remain;
22 23780 6 ctx->line_len = git__linenlen(ctx->line, ctx->remain_len);
23 23782 7 ctx->line_num = 1;
24 -
25 23782 7 return 0;
26 - }
27 -
28 4863 2 void git_parse_ctx_clear(git_parse_ctx *ctx)
29 - {
30 4863 2 memset(ctx, 0, sizeof(*ctx));
31 4863 2 ctx->content = "";
32 4863 2 }
33 -
34 182351 2 void git_parse_advance_line(git_parse_ctx *ctx)
35 - {
36 182351 2 ctx->line += ctx->line_len;
37 182351 2 ctx->remain_len -= ctx->line_len;
38 182351 2 ctx->line_len = git__linenlen(ctx->line, ctx->remain_len);
39 182349 3 ctx->line_num++;
40 182349 3 }
41 -
42 99557 2 void git_parse_advance_chars(git_parse_ctx *ctx, size_t char_cnt)
43 - {
44 99557 2 ctx->line += char_cnt;
45 99557 2 ctx->remain_len -= char_cnt;
46 99557 2 ctx->line_len -= char_cnt;
47 99557 2 }
48 -
49 2965 2 int git_parse_advance_expected(
50 - git_parse_ctx *ctx,
51 - const char *expected,
52 - size_t expected_len)
53 - {
54 2965 2 if (ctx->line_len < expected_len)
55 ##### 3 return -1;
56 -
57 2965 4 if (memcmp(ctx->line, expected, expected_len) != 0)
58 ##### 5 return -1;
59 -
60 2965 6 git_parse_advance_chars(ctx, expected_len);
61 2965 7 return 0;
62 - }
63 -
64 178930 2 int git_parse_advance_ws(git_parse_ctx *ctx)
65 - {
66 178930 2 int ret = -1;
67 -
68 379758 2,4,5 while (ctx->line_len > 0 &&
69 379726 5,7 ctx->line[0] != '\n' &&
70 378682 6 git__isspace(ctx->line[0])) {
71 200828 3 ctx->line++;
72 200828 3 ctx->line_len--;
73 200828 3 ctx->remain_len--;
74 200828 3 ret = 0;
75 - }
76 -
77 178916 8 return ret;
78 - }
79 -
80 147 2 int git_parse_advance_nl(git_parse_ctx *ctx)
81 - {
82 147 2,3 if (ctx->line_len != 1 || ctx->line[0] != '\n')
83 1 4 return -1;
84 -
85 146 5 git_parse_advance_line(ctx);
86 146 6 return 0;
87 - }
88 -
89 1034 2 int git_parse_advance_digit(int64_t *out, git_parse_ctx *ctx, int base)
90 - {
91 - const char *end;
92 - int ret;
93 -
94 1034 2-4 if (ctx->line_len < 1 || !git__isdigit(ctx->line[0]))
95 2 5 return -1;
96 -
97 1032 6,7 if ((ret = git__strntol64(out, ctx->line, ctx->line_len, &end, base)) < 0)
98 ##### 8 return -1;
99 -
100 1032 9 git_parse_advance_chars(ctx, (end - ctx->line));
101 1032 10 return 0;
102 - }
103 -
104 1491 2 int git_parse_advance_oid(git_oid *out, git_parse_ctx *ctx)
105 - {
106 1491 2 if (ctx->line_len < GIT_OID_HEXSZ)
107 ##### 3 return -1;
108 1491 4,5 if ((git_oid_fromstrn(out, ctx->line, GIT_OID_HEXSZ)) < 0)
109 1 6 return -1;
110 1490 7 git_parse_advance_chars(ctx, GIT_OID_HEXSZ);
111 1490 8 return 0;
112 - }
113 -
114 270578 2 int git_parse_peek(char *out, git_parse_ctx *ctx, int flags)
115 - {
116 270578 2 size_t remain = ctx->line_len;
117 270578 2 const char *ptr = ctx->line;
118 -
119 525758 2,8 while (remain) {
120 471518 3 char c = *ptr;
121 -
122 471518 3,5 if ((flags & GIT_PARSE_PEEK_SKIP_WHITESPACE) &&
123 432785 4 git__isspace(c)) {
124 255180 6 remain--;
125 255180 6 ptr++;
126 255180 6 continue;
127 - }
128 -
129 216386 7 *out = c;
130 216386 7 return 0;
131 - }
132 -
133 54240 9 return -1;
134 - }