From 7f26e2d85dac7cbd445d553e0cfcfe2f54714dd8 Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Thu, 20 Feb 2020 19:23:51 +0100
Subject: [PATCH] avoid use of pow()

---
 pdf.c | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/pdf.c b/pdf.c
index 55df706..0101ca2 100644
--- a/pdf.c
+++ b/pdf.c
@@ -255,8 +255,6 @@ act_a85zero(const HParseResult *p, void *u)
 	return H_MAKE_UINT(b);
 }
 
-#include <math.h>	/* pow() */
-
 HParsedToken *
 act_a85digit(const HParseResult *p, void *u)
 {
@@ -279,11 +277,11 @@ act_a85fivedigits(const HParseResult *p, void *u)
 
 	/* Only for groups that do not need to padded to 5 */
 	assert(seq->used == 5);
-	fourbytes += H_CAST_UINT(digits[0]) * ((uint64_t) pow(85,4));
-	fourbytes += H_CAST_UINT(digits[1]) * ((uint64_t) pow(85,3));
-	fourbytes += H_CAST_UINT(digits[2]) * ((uint64_t) pow(85,2));
-	fourbytes += H_CAST_UINT(digits[3]) * ((uint64_t) pow(85,1));
-	fourbytes += H_CAST_UINT(digits[4]);
+	fourbytes = H_CAST_UINT(digits[0]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[1]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[2]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[3]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[4]);
 
 	assert(fourbytes <= A85GRPMAX);
 	return H_MAKE_UINT(fourbytes);
@@ -322,8 +320,9 @@ act_a85partial2group(const HParseResult *p, void *u)
 	HParsedToken **digits = h_seq_elements(p->ast);
 
 	assert(seq->used == 2);
-	fourbytes += H_CAST_UINT(digits[0]) * ((uint64_t) pow(85,4));
-	fourbytes += H_CAST_UINT(digits[1]) * ((uint64_t) pow(85,3));
+	fourbytes = H_CAST_UINT(digits[0]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[1]);
+	fourbytes *= 85 * 85 * 85;
 
 	assert(fourbytes <= A85GRPMAX);
 	return H_MAKE_UINT(fourbytes);
@@ -343,9 +342,10 @@ act_a85partial3group(const HParseResult *p, void *u)
 	HParsedToken **digits = h_seq_elements(p->ast);
 
 	assert(seq->used == 3);
-	fourbytes += H_CAST_UINT(digits[0]) * ((uint64_t) pow(85,4));
-	fourbytes += H_CAST_UINT(digits[1]) * ((uint64_t) pow(85,3));
-	fourbytes += H_CAST_UINT(digits[2]) * ((uint64_t) pow(85,2));
+	fourbytes = H_CAST_UINT(digits[0]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[1]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[2]);
+	fourbytes *= 85 * 85;
 
 	assert(fourbytes <= A85GRPMAX);
 	return H_MAKE_UINT(fourbytes);
@@ -365,10 +365,11 @@ act_a85partial4group(const HParseResult *p, void *u)
 	HParsedToken **digits = h_seq_elements(p->ast);
 
 	assert(seq->used == 4);
-	fourbytes += H_CAST_UINT(digits[0]) * ((uint64_t) pow(85,4));
-	fourbytes += H_CAST_UINT(digits[1]) * ((uint64_t) pow(85,3));
-	fourbytes += H_CAST_UINT(digits[2]) * ((uint64_t) pow(85,2));
-	fourbytes += H_CAST_UINT(digits[3]) * ((uint64_t) pow(85,1));
+	fourbytes = H_CAST_UINT(digits[0]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[1]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[2]);
+	fourbytes = fourbytes * 85 + H_CAST_UINT(digits[3]);
+	fourbytes *= 85;
 
 	assert(fourbytes <= A85GRPMAX);
 	return H_MAKE_UINT(fourbytes);
-- 
GitLab