git-rm: honor -n flag.
[git.git] / xdiff / xutils.c
index 01e6765..21ab8e7 100644 (file)
 
 
 
+long xdl_bogosqrt(long n) {
+       long i;
+
+       /*
+        * Classical integer square root approximation using shifts.
+        */
+       for (i = 1; n > 0; n >>= 2)
+               i <<= 1;
+
+       return i;
+}
+
+
 int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize,
                     xdemitcb_t *ecb) {
-       mmbuffer_t mb[2];
+       mmbuffer_t mb[3];
+       int i;
 
        mb[0].ptr = (char *) pre;
        mb[0].size = psize;
        mb[1].ptr = (char *) rec;
        mb[1].size = size;
+       i = 2;
 
-       if (ecb->outf(ecb->priv, mb, 2) < 0) {
+       if (!size || rec[size-1] != '\n') {
+               mb[2].ptr = "\n\\ No newline at end of file\n";
+               mb[2].size = strlen(mb[2].ptr);
+               i = 3;
+       }
+
+       if (ecb->outf(ecb->priv, mb, i) < 0) {
 
                return -1;
        }
@@ -227,7 +248,8 @@ long xdl_atol(char const *str, char const **next) {
 }
 
 
-int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, xdemitcb_t *ecb) {
+int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
+                     const char *func, long funclen, xdemitcb_t *ecb) {
        int nb = 0;
        mmbuffer_t mb;
        char buf[128];
@@ -235,25 +257,37 @@ int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, xdemitcb_t *ecb) {
        memcpy(buf, "@@ -", 4);
        nb += 4;
 
-       nb += xdl_num_out(buf + nb, c1 ? s1: 0);
+       nb += xdl_num_out(buf + nb, c1 ? s1: s1 - 1);
 
-       memcpy(buf + nb, ",", 1);
-       nb += 1;
+       if (c1 != 1) {
+               memcpy(buf + nb, ",", 1);
+               nb += 1;
 
-       nb += xdl_num_out(buf + nb, c1);
+               nb += xdl_num_out(buf + nb, c1);
+       }
 
        memcpy(buf + nb, " +", 2);
        nb += 2;
 
-       nb += xdl_num_out(buf + nb, c2 ? s2: 0);
+       nb += xdl_num_out(buf + nb, c2 ? s2: s2 - 1);
 
-       memcpy(buf + nb, ",", 1);
-       nb += 1;
+       if (c2 != 1) {
+               memcpy(buf + nb, ",", 1);
+               nb += 1;
 
-       nb += xdl_num_out(buf + nb, c2);
+               nb += xdl_num_out(buf + nb, c2);
+       }
 
-       memcpy(buf + nb, " @@\n", 4);
-       nb += 4;
+       memcpy(buf + nb, " @@", 3);
+       nb += 3;
+       if (func && funclen) {
+               buf[nb++] = ' ';
+               if (funclen > sizeof(buf) - nb - 1)
+                       funclen = sizeof(buf) - nb - 1;
+               memcpy(buf + nb, func, funclen);
+               nb += funclen;
+       }
+       buf[nb++] = '\n';
 
        mb.ptr = buf;
        mb.size = nb;