summaryrefslogtreecommitdiff
path: root/xdiff-interface.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-04-05 19:22:35 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-04-05 19:22:35 (GMT)
commitc1e335a43fb4c2f422b4d78693b2344114209632 (patch)
tree182e936a9e746ee5ea671e02b2e4af11ef0929b3 /xdiff-interface.c
parentd9ea73e0564c7db8d791fe6b03c976ce57c9b079 (diff)
downloadgit-c1e335a43fb4c2f422b4d78693b2344114209632.zip
git-c1e335a43fb4c2f422b4d78693b2344114209632.tar.gz
git-c1e335a43fb4c2f422b4d78693b2344114209632.tar.bz2
combine-diff: move the code to parse hunk-header into common library.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'xdiff-interface.c')
-rw-r--r--xdiff-interface.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/xdiff-interface.c b/xdiff-interface.c
index 0a66ded..f7d6f98 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, unsigned int *num_p)
+{
+ char *cp = *cp_p;
+ unsigned 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,
+ unsigned int *ob, unsigned int *on,
+ unsigned int *nb, unsigned 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_;