Module Name:    src
Committed By:   riastradh
Date:           Sat Jan 25 16:26:17 UTC 2014

Modified Files:
        src/usr.bin/vndcompress: offtab.c

Log Message:
Factor out an offtab_compute_window_position routine.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/usr.bin/vndcompress/offtab.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/vndcompress/offtab.c
diff -u src/usr.bin/vndcompress/offtab.c:1.11 src/usr.bin/vndcompress/offtab.c:1.12
--- src/usr.bin/vndcompress/offtab.c:1.11	Sat Jan 25 15:31:06 2014
+++ src/usr.bin/vndcompress/offtab.c	Sat Jan 25 16:26:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: offtab.c,v 1.11 2014/01/25 15:31:06 riastradh Exp $	*/
+/*	$NetBSD: offtab.c,v 1.12 2014/01/25 16:26:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: offtab.c,v 1.11 2014/01/25 15:31:06 riastradh Exp $");
+__RCSID("$NetBSD: offtab.c,v 1.12 2014/01/25 16:26:17 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/endian.h>
@@ -88,47 +88,60 @@ offtab_current_window_end(struct offtab 
 	return (offtab->ot_window_start + offtab_current_window_size(offtab));
 }
 
+static void
+offtab_compute_window_position(struct offtab *offtab, uint32_t window_start,
+    size_t *bytes, off_t *pos)
+{
+	const uint32_t window_size = offtab_compute_window_size(offtab,
+	    window_start);
+
+	__CTASSERT(MAX_WINDOW_SIZE <= (OFF_MAX / sizeof(uint64_t)));
+	*bytes = (window_size * sizeof(uint64_t));
+
+	assert(window_start <= offtab->ot_n_offsets);
+	__CTASSERT(MAX_N_OFFSETS <= (SIZE_MAX / sizeof(uint64_t)));
+	const off_t window_offset = ((off_t)window_start *
+	    (off_t)sizeof(uint64_t));
+
+	/* XXX This assertion is not justified.  */
+	assert(offtab->ot_fdpos <= (OFF_MAX - window_offset));
+	*pos = (offtab->ot_fdpos + window_offset);
+}
+
 #define	OFFTAB_READ_SEEK	0x01
 #define	OFFTAB_READ_NOSEEK	0x00
 
 static bool
 offtab_read_window(struct offtab *offtab, uint32_t blkno, int read_flags)
 {
-
-	assert(offtab->ot_mode == OFFTAB_MODE_READ);
-
 	const uint32_t window_start = rounddown(blkno, offtab->ot_window_size);
-	const uint32_t window_size = offtab_compute_window_size(offtab,
-	    window_start);
+	size_t window_bytes;
+	off_t window_pos;
 
-	__CTASSERT(MAX_WINDOW_SIZE <= (SIZE_MAX / sizeof(uint64_t)));
-	__CTASSERT(MAX_N_OFFSETS <= (OFF_MAX / sizeof(uint64_t)));
-	assert(window_start < offtab->ot_n_offsets);
-	const off_t window_offset = ((off_t)window_start *
-	    (off_t)sizeof(uint64_t));
-	assert(offtab->ot_fdpos <= (OFF_MAX - window_offset));
-	const off_t window_pos = (offtab->ot_fdpos + window_offset);
+	assert(offtab->ot_mode == OFFTAB_MODE_READ);
 	assert(ISSET(read_flags, OFFTAB_READ_SEEK) ||
 	    (lseek(offtab->ot_fd, 0, SEEK_CUR) == offtab->ot_fdpos) ||
 	    ((lseek(offtab->ot_fd, 0, SEEK_CUR) == -1) && (errno == ESPIPE)));
-	const size_t n_req = (window_size * sizeof(uint64_t));
+
+	offtab_compute_window_position(offtab, window_start,
+	    &window_bytes, &window_pos);
 	const ssize_t n_read = (ISSET(read_flags, OFFTAB_READ_SEEK)
-	    ? pread_block(offtab->ot_fd, offtab->ot_window, n_req, window_pos)
-	    : read_block(offtab->ot_fd, offtab->ot_window, n_req));
+	    ? pread_block(offtab->ot_fd, offtab->ot_window, window_bytes,
+		window_pos)
+	    : read_block(offtab->ot_fd, offtab->ot_window, window_bytes));
 	if (n_read == -1) {
 		(*offtab->ot_report)("read offset table at %"PRIuMAX,
 		    (uintmax_t)window_pos);
 		return false;
 	}
 	assert(n_read >= 0);
-	if ((size_t)n_read != (window_size * sizeof(uint64_t))) {
+	if ((size_t)n_read != window_bytes) {
 		(*offtab->ot_reportx)("partial read of offset table"
 		    " at %"PRIuMAX": %zu != %zu",
-		    (uintmax_t)window_pos,
-		    (size_t)n_read,
-		    (size_t)(window_size * sizeof(uint64_t)));
+		    (uintmax_t)window_pos, (size_t)n_read, window_bytes);
 		return false;
 	}
+
 	offtab->ot_window_start = window_start;
 
 	return true;
@@ -152,27 +165,22 @@ offtab_maybe_read_window(struct offtab *
 static void
 offtab_write_window(struct offtab *offtab)
 {
+	size_t window_bytes;
+	off_t window_pos;
 
 	assert(offtab->ot_mode == OFFTAB_MODE_WRITE);
 
-	const uint32_t window_size = offtab_current_window_size(offtab);
-	__CTASSERT(MAX_WINDOW_SIZE <= (SIZE_MAX / sizeof(uint64_t)));
-	__CTASSERT(MAX_N_OFFSETS <= (OFF_MAX / sizeof(uint64_t)));
-	assert(offtab->ot_window_start < offtab->ot_n_offsets);
-	const off_t window_offset = ((off_t)offtab->ot_window_start *
-	    (off_t)sizeof(uint64_t));
-	assert(offtab->ot_fdpos <= (OFF_MAX - window_offset));
-	const off_t window_pos = (offtab->ot_fdpos + window_offset);
+	offtab_compute_window_position(offtab, offtab->ot_window_start,
+	    &window_bytes, &window_pos);
 	const ssize_t n_written = pwrite(offtab->ot_fd, offtab->ot_window,
-	    (window_size * sizeof(uint64_t)),
-	    window_pos);
+	    window_bytes, window_pos);
 	if (n_written == -1)
 		err_ss(1, "write initial offset table");
 	assert(n_written >= 0);
-	if ((size_t)n_written != (window_size * sizeof(uint64_t)))
+	if ((size_t)n_written != window_bytes)
 		errx_ss(1, "partial write of initial offset bytes: %zu <= %zu",
 		    (size_t)n_written,
-		    (size_t)(window_size * sizeof(uint64_t)));
+		    window_bytes);
 }
 
 static void

Reply via email to