@ 260915.5

240105.1 · 383f4f5327363d4c5e6a8ae53c57c4a9620aa5e9

released 4.5.0

- add 7zip archive search with option -z, fix #185
- apply Unicode normalization to combining characters in regex patterns, fix #298
- improved TUI TAB directory navigation when searching from the FS root
- updated ugrep.exe option -P to use PCRE2 10.42

reading declarations

Changes to lzma/C/Delta.c. All files

lzma/C/Delta.c

new file mode 100644@@ -0,0 +1,169 @@+/* Delta.c -- Delta converter+2021-02-09 : Igor Pavlov : Public domain */++#include "Precomp.h"++#include "Delta.h"++void Delta_Init(Byte *state)+{+  unsigned i;+  for (i = 0; i < DELTA_STATE_SIZE; i++)+    state[i] = 0;+}+++void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size)+{+  Byte temp[DELTA_STATE_SIZE];++  if (size == 0)+    return;++  {+    unsigned i = 0;+    do+      temp[i] = state[i];+    while (++i != delta);+  }++  if (size <= delta)+  {+    unsigned i = 0, k;+    do+    {+      Byte b = *data;+      *data++ = (Byte)(b - temp[i]);+      temp[i] = b;+    }+    while (++i != size);+    +    k = 0;+    +    do+    {+      if (i == delta)+        i = 0;+      state[k] = temp[i++];+    }+    while (++k != delta);+    +    return;+  }+    +  {+    Byte *p = data + size - delta;+    {+      unsigned i = 0;+      do+        state[i] = *p++;+      while (++i != delta);+    }+    {+      const Byte *lim = data + delta;+      ptrdiff_t dif = -(ptrdiff_t)delta;+      +      if (((ptrdiff_t)size + dif) & 1)+      {+        --p;  *p = (Byte)(*p - p[dif]);+      }++      while (p != lim)+      {+        --p;  *p = (Byte)(*p - p[dif]);+        --p;  *p = (Byte)(*p - p[dif]);+      }+      +      dif = -dif;+      +      do+      {+        --p;  *p = (Byte)(*p - temp[--dif]);+      }+      while (dif != 0);+    }+  }+}+++void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size)+{+  unsigned i;+  const Byte *lim;++  if (size == 0)+    return;+  +  i = 0;+  lim = data + size;+  +  if (size <= delta)+  {+    do+      *data = (Byte)(*data + state[i++]);+    while (++data != lim);++    for (; delta != i; state++, delta--)+      *state = state[i];+    data -= i;+  }+  else+  {+    /*+    #define B(n) b ## n+    #define I(n) Byte B(n) = state[n];+    #define U(n) { B(n) = (Byte)((B(n)) + *data++); data[-1] = (B(n)); }+    #define F(n) if (data != lim) { U(n) }++    if (delta == 1)+    {+      I(0)+      if ((lim - data) & 1) { U(0) }+      while (data != lim) { U(0) U(0) }+      data -= 1;+    }+    else if (delta == 2)+    {+      I(0) I(1)+      lim -= 1; while (data < lim) { U(0) U(1) }+      lim += 1; F(0)+      data -= 2;+    }+    else if (delta == 3)+    {+      I(0) I(1) I(2)+      lim -= 2; while (data < lim) { U(0) U(1) U(2) }+      lim += 2; F(0) F(1)+      data -= 3;+    }+    else if (delta == 4)+    {+      I(0) I(1) I(2) I(3)+      lim -= 3; while (data < lim) { U(0) U(1) U(2) U(3) }+      lim += 3; F(0) F(1) F(2)+      data -= 4;+    }+    else+    */+    {+      do+      {+        *data = (Byte)(*data + state[i++]);+        data++;+      }+      while (i != delta);+  +      {+        ptrdiff_t dif = -(ptrdiff_t)delta;+        do+          *data = (Byte)(*data + data[dif]);+        while (++data != lim);+        data += dif;+      }+    }+  }++  do+    *state++ = *data;+  while (++data != lim);+}