X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=xdiff-interface.c;h=6a82da73b6d3b6b8cca23c3183cddc36c5cafb4b;hb=fb6a9f93d39e4e5fdb83673a927f71a34e9fb7c0;hp=0a66ded9533009a8efb840db5377f0abf5fccb1b;hpb=d9ea73e0564c7db8d791fe6b03c976ce57c9b079;p=git.git diff --git a/xdiff-interface.c b/xdiff-interface.c index 0a66ded9..6a82da73 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -1,6 +1,52 @@ #include "cache.h" #include "xdiff-interface.h" +static int parse_num(char **cp_p, int *num_p) +{ + char *cp = *cp_p; + int num = 0; + int read_some; + + while ('0' <= *cp && *cp <= '9') + num = num * 10 + *cp++ - '0'; + if (!(read_some = cp - *cp_p)) + return -1; + *cp_p = cp; + *num_p = num; + return 0; +} + +int parse_hunk_header(char *line, int len, + int *ob, int *on, + int *nb, int *nn) +{ + char *cp; + cp = line + 4; + if (parse_num(&cp, ob)) { + bad_line: + return error("malformed diff output: %s", line); + } + if (*cp == ',') { + cp++; + if (parse_num(&cp, on)) + goto bad_line; + } + else + *on = 1; + if (*cp++ != ' ' || *cp++ != '+') + goto bad_line; + if (parse_num(&cp, nb)) + goto bad_line; + if (*cp == ',') { + cp++; + if (parse_num(&cp, nn)) + goto bad_line; + } + else + *nn = 1; + return -!!memcmp(cp, " @@", 3); +} + static void consume_one(void *priv_, char *s, unsigned long size) { struct xdiff_emit_state *priv = priv_;