{"thread":{"id":"4618","subject":"[PATCH 1/3] Optionally emit function names in the hunk headers.","startedAt":"2006-06-22T18:58:02Z","lastAt":"2006-06-22T18:58:02Z","messageCount":1,"participants":["Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"22290","messageId":"7v8xnpm30l.fsf@assigned-by-dhcp.cox.net","threadId":"4618","inReplyTo":null,"subject":"[PATCH 1/3] Optionally emit function names in the hunk headers.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-06-22T18:58:02Z","receivedAt":"2006-06-22T18:58:02Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"From: Mark Wooding <mdw@distorted.org.uk>\n\nThis is a patch on top of libxdiff 0.21 we use in the git project.\n---\n xdiff.h   |    5 ++++-\n xemit.c   |   41 ++++++++++++++++++++++++++++++++++++++++-\n xpatchi.c |    2 +-\n xutils.c  |   31 ++++++++++++++++++++++---------\n xutils.h  |    3 ++-\n 5 files changed, 69 insertions(+), 13 deletions(-)\n\ndiff --git a/xdiff.h b/xdiff.h\nindex d051216..f4af41b 100644\n--- a/xdiff.h\n+++ b/xdiff.h\n@@ -34,7 +34,9 @@ #define XDL_PATCH_NORMAL '-'\n #define XDL_PATCH_REVERSE '+'\n #define XDL_PATCH_MODEMASK ((1 << 8) - 1)\n #define XDL_PATCH_IGNOREBSPACE (1 << 8)\n-\t\n+\n+#define XDL_EMIT_FUNCNAMES (1 << 0)\n+\n #define XDL_MMB_READONLY (1 << 0)\n \n #define XDL_MMF_ATOMIC (1 << 0)\n@@ -82,6 +84,7 @@ typedef struct s_xdemitcb {\n \n typedef struct s_xdemitconf {\n \tlong ctxlen;\n+\tunsigned long flags;\n } xdemitconf_t;\n \n typedef struct s_bdiffparam {\ndiff --git a/xemit.c b/xemit.c\nindex 2e5d54c..ad5bfb1 100644\n--- a/xemit.c\n+++ b/xemit.c\n@@ -69,10 +69,43 @@ static xdchange_t *xdl_get_hunk(xdchange\n }\n \n \n+static void xdl_find_func(xdfile_t *xf, long i, char *buf, long sz, long *ll) {\n+\n+\t/*\n+\t * Be quite stupid about this for now.  Find a line in the old file\n+\t * before the start of the hunk (and context) which starts with a\n+\t * plausible character.\n+\t */\n+\n+\tconst char *rec;\n+\tlong len;\n+\n+\t*ll = 0;\n+\twhile (i-- > 0) {\n+\t\tlen = xdl_get_rec(xf, i, &rec);\n+\t\tif (len > 0 &&\n+\t\t    (isalpha((unsigned char)*rec) || /* identifier? */\n+\t\t     *rec == '_' ||\t/* also identifier? */\n+\t\t     *rec == '(' ||\t/* lisp defun? */\n+\t\t     *rec == '#')) {\t/* #define? */\n+\t\t\tif (len > sz)\n+\t\t\t\tlen = sz;\n+\t\t\tif (len && rec[len - 1] == '\\n')\n+\t\t\t\tlen--;\n+\t\t\tmemcpy(buf, rec, len);\n+\t\t\t*ll = len;\n+\t\t\treturn;\n+\t\t}\n+\t}\n+}\n+\n+\n int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,\n \t\t  xdemitconf_t const *xecfg) {\n \tlong s1, s2, e1, e2, lctx;\n \txdchange_t *xch, *xche;\n+\tchar funcbuf[40];\n+\tlong funclen = 0;\n \n \tfor (xch = xche = xscr; xch; xch = xche->next) {\n \t\txche = xdl_get_hunk(xch, xecfg);\n@@ -90,7 +123,13 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange\n \t\t/*\n \t\t * Emit current hunk header.\n \t\t */\n-\t\tif (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2, ecb) < 0)\n+\n+\t\tif (xecfg->flags & XDL_EMIT_FUNCNAMES) {\n+\t\t\txdl_find_func(&xe->xdf1, s1, funcbuf,\n+\t\t\t\t      sizeof(funcbuf), &funclen);\n+\t\t}\n+\t\tif (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2,\n+\t\t\t\t      funcbuf, funclen, ecb) < 0)\n \t\t\treturn -1;\n \n \t\t/*\ndiff --git a/xpatchi.c b/xpatchi.c\nindex dc984f8..da4e018 100644\n--- a/xpatchi.c\n+++ b/xpatchi.c\n@@ -530,7 +530,7 @@ static int xdl_reject_hunk(recfile_t *rf\n \t\tc2 = pch->hi.c1;\n \t}\n \ts1 += pch->ps.adds - pch->ps.dels;\n-\tif (xdl_emit_hunk_hdr(s1 + 1, c1, s2 + 1, c2, rjecb) < 0) {\n+\tif (xdl_emit_hunk_hdr(s1 + 1, c1, s2 + 1, c2, NULL, 0, rjecb) < 0) {\n \n \t\treturn -1;\n \t}\ndiff --git a/xutils.c b/xutils.c\nindex 2fe09d8..a776706 100644\n--- a/xutils.c\n+++ b/xutils.c\n@@ -542,7 +542,8 @@ long xdl_atol(char const *str, char cons\n }\n \n \n-int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, xdemitcb_t *ecb) {\n+int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,\n+\t\t      const char *func, long funclen, xdemitcb_t *ecb) {\n \tint nb = 0;\n \tmmbuffer_t mb;\n \tchar buf[128];\n@@ -552,23 +553,35 @@ int xdl_emit_hunk_hdr(long s1, long c1, \n \n \tnb += xdl_num_out(buf + nb, c1 ? s1: s1 - 1);\n \n-\tmemcpy(buf + nb, \",\", 1);\n-\tnb += 1;\n+\tif (c1 != 1) {\n+\t\tmemcpy(buf + nb, \",\", 1);\n+\t\tnb += 1;\n \n-\tnb += xdl_num_out(buf + nb, c1);\n+\t\tnb += xdl_num_out(buf + nb, c1);\n+\t}\n \n \tmemcpy(buf + nb, \" +\", 2);\n \tnb += 2;\n \n \tnb += xdl_num_out(buf + nb, c2 ? s2: s2 - 1);\n \n-\tmemcpy(buf + nb, \",\", 1);\n-\tnb += 1;\n+\tif (c2 != 1) {\n+\t\tmemcpy(buf + nb, \",\", 1);\n+\t\tnb += 1;\n \n-\tnb += xdl_num_out(buf + nb, c2);\n+\t\tnb += xdl_num_out(buf + nb, c2);\n+\t}\n \n-\tmemcpy(buf + nb, \" @@\\n\", 4);\n-\tnb += 4;\n+\tmemcpy(buf + nb, \" @@\", 3);\n+\tnb += 3;\n+\tif (func && funclen) {\n+\t\tbuf[nb++] = ' ';\n+\t\tif (funclen > sizeof(buf) - nb - 1)\n+\t\t\tfunclen = sizeof(buf) - nb - 1;\n+\t\tmemcpy(buf + nb, func, funclen);\n+\t\tnb += funclen;\n+\t}\n+\tbuf[nb++] = '\\n';\n \n \tmb.ptr = buf;\n \tmb.size = nb;\ndiff --git a/xutils.h b/xutils.h\nindex 4ceae33..5a3e13b 100644\n--- a/xutils.h\n+++ b/xutils.h\n@@ -39,7 +39,8 @@ unsigned long xdl_hash_record(char const\n unsigned int xdl_hashbits(unsigned int size);\n int xdl_num_out(char *out, long val);\n long xdl_atol(char const *str, char const **next);\n-int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, xdemitcb_t *ecb);\n+int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,\n+\t\t      const char *func, long funclen, xdemitcb_t *ecb);\n \n \n \n-- \n1.4.0.gbf9e\n"}]}