diff checksum/dosum.c @ 11:3aa0f5a02342

Remove unused variable; fix what it was supposed to be doing. (and document it a bit for the next time through here)
author David A. Holland
date Tue, 31 May 2022 00:54:12 -0400
parents 13d2b8934445
children
line wrap: on
line diff
--- a/checksum/dosum.c	Mon May 30 23:58:14 2022 -0400
+++ b/checksum/dosum.c	Tue May 31 00:54:12 2022 -0400
@@ -66,7 +66,6 @@
 
 uint32_t dosum(const char *buf, size_t len, size_t skipstart, size_t skiplen) {
   struct sumstate s;
-  unsigned fudge;
   size_t numwords;
 
   assert(skiplen%2==0);
@@ -79,6 +78,18 @@
    *
    * The followed mangled logic that rounds some things up matches
    * what used to be done in an even uglier way.
+   *
+   * To wit: if there's a skip area, we start after it and read pairs
+   * of octets, including a zero past the end of the file if the
+   * remaining data length after the skip area has odd size, so as to
+   * get the last byte. (The caller is responsible for making sure
+   * there's a zero there.) Then we read the beginning of the file up
+   * to the skip area, but round down so as to not read the first byte
+   * of the skip area if skipstart is odd. If skipstart is odd then we
+   * wedge in that last byte along with a zero.
+   *
+   * If there isn't a skip area, we read the whole thing in order,
+   * including the zero past the end if the size is odd.
    */
 
   assert(sizeof(uint16_t)==2);
@@ -90,9 +101,15 @@
     size_t p1 = 0;
     size_t l1 = (skipstart/2) * 2;
 
-    fudge = skipstart%2;
     sumstate_sum(&s, buf+p0, l0);
     sumstate_sum(&s, buf+p1, l1);
+    if (skipstart % 2 == 1) {
+       char tmp[2];
+
+       tmp[0] = buf[skipstart - 1];
+       tmp[1] = 0;
+       sumstate_sum(&s, tmp, 2);
+    }
   }
   else {
     sumstate_sum(&s, buf, numwords * 2);