:: commit c0a0bed8f88e0cbc40125dc21df78eb949a6d31d

Mintsuki <mintsuki@protonmail.com> — 2026-04-20 15:46

parents: b1c28f00e4

tools/limlzpack: Use int32_t for suffix array indices

diff --git a/tools/limlzpack.c b/tools/limlzpack.c
index f2bfc79b..024f14a4 100644
--- a/tools/limlzpack.c
+++ b/tools/limlzpack.c
@@ -85,29 +85,29 @@ static bool bigendian = false;
 /*  Higher -> better compression with exponentally dimnishing gains.  */
 #define LIMLZ_SA_NEIGHBORS 32
 
-struct sa_cmp_ctx { int * rank; size_t n, k; };
+struct sa_cmp_ctx { int32_t *rank; size_t n, k; };
 static struct sa_cmp_ctx g_sa_ctx;
 
-static int sa_cmp_idx(int i, int j) {
-  int ri, rj;
+static int32_t sa_cmp_idx(int32_t i, int32_t j) {
+  int32_t ri, rj;
   if (g_sa_ctx.rank[i] != g_sa_ctx.rank[j])
     return g_sa_ctx.rank[i] - g_sa_ctx.rank[j];
-  ri = (i + (int)g_sa_ctx.k < (int)g_sa_ctx.n) ? g_sa_ctx.rank[i + g_sa_ctx.k] : -1;
-  rj = (j + (int)g_sa_ctx.k < (int)g_sa_ctx.n) ? g_sa_ctx.rank[j + g_sa_ctx.k] : -1;
+  ri = (i + (int32_t)g_sa_ctx.k < (int32_t)g_sa_ctx.n) ? g_sa_ctx.rank[i + g_sa_ctx.k] : -1;
+  rj = (j + (int32_t)g_sa_ctx.k < (int32_t)g_sa_ctx.n) ? g_sa_ctx.rank[j + g_sa_ctx.k] : -1;
   return ri - rj;
 }
 
 static int sa_qsort_cmp(const void * a, const void * b) {
-  int i = *(const int *) a, j = *(const int *) b;
-  return sa_cmp_idx(i, j);
+  int32_t d = sa_cmp_idx(*(const int32_t *)a, *(const int32_t *)b);
+  return (d > 0) - (d < 0);
 }
 
-static int saca(const byte * s, size_t n, int * sa, int * rank, int * tmp) {
+static int saca(const byte * s, size_t n, int32_t * sa, int32_t * rank, int32_t * tmp) {
   size_t i;
   if (!n)
     return 0;
   for (i = 0; i < n; ++i) {
-    sa[i] = (int)i;  rank[i] = (int)s[i];
+    sa[i] = (int32_t)i;  rank[i] = (int32_t)s[i];
   }
   for (g_sa_ctx.k = 1;; g_sa_ctx.k <<= 1) {
     g_sa_ctx.rank = rank;  g_sa_ctx.n = n;
@@ -133,7 +133,7 @@ struct match_choice { uint32_t len;  uint16_t off; };
 struct parse_choice { uint32_t lit, mlen;  uint16_t off; };
 
 static int longest_matches(const byte * src, size_t n, struct match_choice * mch) {
-  int * sa, * rank, * tmp, * inv;
+  int32_t *sa, *rank, *tmp, *inv;
   size_t i;
   if (!n)
     return 0;
@@ -146,9 +146,10 @@ static int longest_matches(const byte * src, size_t n, struct match_choice * mch
     return -1;
   }
   for (i = 0; i < n; ++i)
-    inv[sa[i]] = (int)i;
+    inv[sa[i]] = (int32_t)i;
   for (i = 0; i < n; ++i) {
-    int r = inv[i], d, rr;
+    int32_t r = inv[i], rr;
+    int d;
     size_t best_len = 0;
     uint16_t best_off = 0;
     for (d = -LIMLZ_SA_NEIGHBORS; d <= LIMLZ_SA_NEIGHBORS; ++d) {
@@ -156,7 +157,7 @@ static int longest_matches(const byte * src, size_t n, struct match_choice * mch
       if (!d)
         continue;
       rr = r + d;
-      if (rr < 0 || rr >= (int)n)
+      if (rr < 0 || rr >= (int32_t)n)
         continue;
       j = (size_t)sa[rr];
       if (j >= i)
tab: 248 wrap: offon