diff options
Diffstat (limited to 'parsing.c')
-rw-r--r-- | parsing.c | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -104,3 +104,56 @@ int cgit_parse_query(char *txt, configfn fn) | |||
104 | (*fn)(txt, value); | 104 | (*fn)(txt, value); |
105 | return 0; | 105 | return 0; |
106 | } | 106 | } |
107 | |||
108 | char *substr(const char *head, const char *tail) | ||
109 | { | ||
110 | char *buf; | ||
111 | |||
112 | buf = xmalloc(tail - head + 1); | ||
113 | strncpy(buf, head, tail - head); | ||
114 | buf[tail - head] = '\0'; | ||
115 | return buf; | ||
116 | } | ||
117 | |||
118 | struct commitinfo *cgit_parse_commit(struct commit *commit) | ||
119 | { | ||
120 | struct commitinfo *ret; | ||
121 | char *p = commit->buffer, *t = commit->buffer; | ||
122 | |||
123 | ret = xmalloc(sizeof(*ret)); | ||
124 | ret->commit = commit; | ||
125 | |||
126 | if (strncmp(p, "tree ", 5)) | ||
127 | die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); | ||
128 | else | ||
129 | p += 46; // "tree " + hex[40] + "\n" | ||
130 | |||
131 | while (!strncmp(p, "parent ", 7)) | ||
132 | p += 48; // "parent " + hex[40] + "\n" | ||
133 | |||
134 | if (!strncmp(p, "author ", 7)) { | ||
135 | p += 7; | ||
136 | t = strchr(p, '<') - 1; | ||
137 | ret->author = substr(p, t); | ||
138 | p = strchr(p, '\n') + 1; | ||
139 | } | ||
140 | |||
141 | if (!strncmp(p, "committer ", 9)) { | ||
142 | p += 9; | ||
143 | t = strchr(p, '<') - 1; | ||
144 | ret->committer = substr(p, t); | ||
145 | p = strchr(p, '\n') + 1; | ||
146 | } | ||
147 | |||
148 | while (*p == '\n') | ||
149 | p = strchr(p, '\n') + 1; | ||
150 | |||
151 | t = strchr(p, '\n'); | ||
152 | ret->subject = substr(p, t); | ||
153 | |||
154 | while (*p == '\n') | ||
155 | p = strchr(p, '\n') + 1; | ||
156 | ret->msg = p; | ||
157 | |||
158 | return ret; | ||
159 | } | ||