int last_line_kind;
};
-static int is_conflict_marker(const char *line, int marker_size, unsigned long len)
-{
- char firstchar;
- int cnt;
-
- if (len < marker_size + 1)
- return 0;
- firstchar = line[0];
- switch (firstchar) {
- case '=': case '>': case '<': case '|':
- break;
- default:
- return 0;
- }
- for (cnt = 1; cnt < marker_size; cnt++)
- if (line[cnt] != firstchar)
- return 0;
- /* line[1] through line[marker_size-1] are same as firstchar */
- if (len < marker_size + 1 || !isspace(line[marker_size]))
- return 0;
- return 1;
-}
-
static void checkdiff_consume_hunk(void *priv,
long ob UNUSED, long on UNUSED,
long nb, long nn UNUSED,
if (line[0] == '+') {
unsigned bad;
data->lineno++;
- if (is_conflict_marker(line + 1, marker_size, len - 1)) {
+ if (is_conflict_marker_line(line + 1, len - 1, marker_size)) {
data->status |= 1;
fprintf(data->o->file,
"%s%s:%d: leftover conflict marker\n",
}
return marker_size;
}
+
+int is_conflict_marker_line(const char *line, unsigned long len, int marker_size)
+{
+ char firstchar;
+ int cnt;
+
+ if (len < marker_size + 1)
+ return 0;
+
+ firstchar = line[0];
+ switch (firstchar) {
+ case '=': case '>': case '<': case '|':
+ break;
+ default:
+ return 0;
+ }
+
+ for (cnt = 1; cnt < marker_size; cnt++) {
+ if (line[cnt] != firstchar)
+ return 0;
+ }
+
+ if (((firstchar == '<') || (firstchar == '>')) &&
+ line[marker_size] != ' ')
+ return 0;
+
+ if (!isspace((unsigned char)line[marker_size]))
+ return 0;
+
+ return firstchar;
+}
return strbuf_getwholeline(sb, io->input, '\n');
}
-/*
- * Require the exact number of conflict marker letters, no more, no
- * less, followed by SP or any whitespace
- * (including LF).
- */
-static int is_cmarker(char *buf, int marker_char, int marker_size)
-{
- int want_sp;
-
- /*
- * The beginning of our version and the end of their version
- * always are labeled like "<<<<< ours" or ">>>>> theirs",
- * hence we set want_sp for them. Note that the version from
- * the common ancestor in diff3-style output is not always
- * labelled (e.g. "||||| common" is often seen but "|||||"
- * alone is also valid), so we do not set want_sp.
- */
- want_sp = (marker_char == '<') || (marker_char == '>');
-
- while (marker_size--)
- if (*buf++ != marker_char)
- return 0;
- if (want_sp && *buf != ' ')
- return 0;
- return isspace(*buf);
-}
-
static void rerere_strbuf_putconflict(struct strbuf *buf, int ch, size_t size)
{
strbuf_addchars(buf, ch, size);
int has_conflicts = -1;
while (!io->getline(&buf, io)) {
- if (is_cmarker(buf.buf, '<', marker_size)) {
+ int marker = is_conflict_marker_line(buf.buf, buf.len, marker_size);
+ if (marker == '<') {
if (handle_conflict(&conflict, io, marker_size, NULL) < 0)
break;
if (hunk == RR_SIDE_1)
else
strbuf_addbuf(&two, &conflict);
strbuf_release(&conflict);
- } else if (is_cmarker(buf.buf, '|', marker_size)) {
+ } else if (marker == '|') {
if (hunk != RR_SIDE_1)
break;
hunk = RR_ORIGINAL;
- } else if (is_cmarker(buf.buf, '=', marker_size)) {
+ } else if (marker == '=') {
if (hunk != RR_SIDE_1 && hunk != RR_ORIGINAL)
break;
hunk = RR_SIDE_2;
- } else if (is_cmarker(buf.buf, '>', marker_size)) {
+ } else if (marker == '>') {
if (hunk != RR_SIDE_2)
break;
if (strbuf_cmp(&one, &two) > 0)
git_hash_init(&ctx, the_hash_algo);
while (!io->getline(&buf, io)) {
- if (is_cmarker(buf.buf, '<', marker_size)) {
+ if (is_conflict_marker_line(buf.buf, buf.len, marker_size) == '<') {
has_conflicts = handle_conflict(&out, io, marker_size,
hash ? &ctx : NULL);
if (has_conflicts < 0)