Revision: 77365
http://sourceforge.net/p/brlcad/code/77365
Author: brlcad
Date: 2020-10-08 05:37:15 +0000 (Thu, 08 Oct 2020)
Log Message:
-----------
prevent stop-after value from interfering with iteration until end of input.
also fix a bug causing double-skipping of inputs. most significant is
switching from relying upon EOF to asuming a valid stat size so users can
specify lengths that go beyond available data.
Modified Paths:
--------------
brlcad/trunk/bench/pixcmp.c
Modified: brlcad/trunk/bench/pixcmp.c
===================================================================
--- brlcad/trunk/bench/pixcmp.c 2020-10-08 04:12:17 UTC (rev 77364)
+++ brlcad/trunk/bench/pixcmp.c 2020-10-08 05:37:15 UTC (rev 77365)
@@ -222,7 +222,6 @@
handle_range_opt(range, &f1_skip, &f2_skip);
}
- /* printf("Skip from FILE1: %ld and from FILE2: %ld\n", f1_skip, f2_skip);
*/
if (!print_bytes) {
f1_skip *= 3;
f2_skip *= 3;
@@ -244,14 +243,14 @@
}
if (f1_skip != f2_skip && f1 == stdin && f2 == stdin) {
- bu_log("ERROR: Cannot skip the same input stream by different
amounts\n\n");
- usage(argv0);
- exit(OPTS_ERROR);
+ bu_exit(OPTS_ERROR, "ERROR: cannot skip the same input stream by
different amounts\n");
}
fstat(fileno(f1), &sf1);
fstat(fileno(f2), &sf2);
+ bu_log("FILE1_size(%zu) FILE1_skip(%zu) FILE2_size(%zu)
FILE2_skip(%zu)\n", (size_t)sf1.st_size, f1_skip, (size_t)sf2.st_size, f2_skip);
+
if (!quiet && ((sf1.st_size - f1_skip) != (sf2.st_size - f2_skip))) {
bu_log("WARNING: Different image sizes detected\n");
if (print_bytes) {
@@ -267,38 +266,51 @@
}
}
+ /* make sure we read all bytes */
+ if (stop_after == 0) {
+ stop_after = FMAX((sf1.st_size - f1_skip), (sf2.st_size - f2_skip));
+ if (f1 == stdin && f2 == stdin) {
+ /* dual stdin is interleaved */
+ stop_after = (stop_after+1)/2;
+ }
+ }
+
/*
- bu_log("!!! mode is [%d] and [%d]\n", S_ISFIFO(sf1.st_mode),
S_ISFIFO(sf2.st_mode));
- bu_log("!!! tty is [%d] and [%d]\n", isatty(fileno(f1)),
isatty(fileno(f2)));
+ bu_log("mode is [%d] and [%d]\n", S_ISFIFO(sf1.st_mode),
S_ISFIFO(sf2.st_mode));
+ bu_log("tty is [%d] and [%d]\n", isatty(fileno(f1)), isatty(fileno(f2)));
*/
/* skip requested pixels/bytes in FILE1 */
- if (f1_skip && !S_ISFIFO(sf1.st_mode) && fseek(f1, f1_skip, SEEK_SET)) {
- bu_log("ERROR: Unable to seek %zd %s%s in FILE1\n",
- f1_skip,
- print_bytes?"byte":"pixel",
- f1_skip==1?"":"s");
- perror("FILE1 fseek failure");
- exit(FILE_ERROR);
- } else {
- size_t skipped = 0;
- for (skipped = 0; skipped < f1_skip; skipped++) {
- (void)fgetc(f1);
+ if (f1_skip) {
+ if (S_ISFIFO(sf1.st_mode)) {
+ size_t skipped = 0;
+ for (skipped = 0; skipped < f1_skip; skipped++) {
+ (void)fgetc(f1);
+ }
+ } else if (fseek(f1, f1_skip, SEEK_SET)) {
+ bu_log("ERROR: Unable to seek %zd %s%s in FILE1\n",
+ f1_skip,
+ print_bytes?"byte":"pixel",
+ f1_skip==1?"":"s");
+ perror("FILE1 fseek failure");
+ exit(FILE_ERROR);
}
}
/* skip requested pixels in FILE2 */
- if (f2_skip && !S_ISFIFO(sf2.st_mode) && fseek(f2, f2_skip, SEEK_SET)) {
- bu_log("ERROR: Unable to seek %zd %s%s in FILE2\n",
- f2_skip,
- print_bytes?"byte":"pixel",
- f2_skip==1?"":"s");
- perror("FILE2 fseek failure");
- exit(FILE_ERROR);
- } else {
- size_t skipped = 0;
- for (skipped = 0; skipped < f2_skip; skipped++) {
- (void)fgetc(f2);
+ if (f2_skip) {
+ if (S_ISFIFO(sf2.st_mode)) {
+ size_t skipped = 0;
+ for (skipped = 0; skipped < f2_skip; skipped++) {
+ (void)fgetc(f2);
+ }
+ } else if (fseek(f2, f2_skip, SEEK_SET)) {
+ bu_log("ERROR: Unable to seek %zd %s%s in FILE2\n",
+ f2_skip,
+ print_bytes?"byte":"pixel",
+ f2_skip==1?"":"s");
+ perror("FILE2 fseek failure");
+ exit(FILE_ERROR);
}
}
@@ -311,27 +323,21 @@
}
}
- /* make sure we don't stop */
- if (stop_after == 0)
- stop_after = SIZE_MAX;
+ /* bu_log("INITIAL: bytes[%zu] < stop[%zu]\n", bytes, stop_after); */
/* iterate over the pixels/bytes in the files */
- while ((!feof(f1) || !feof(f2))
- && (!ferror(f1) || !ferror(f2)))
- {
+ while (bytes < stop_after) {
enum label result;
int r1, r2, g1, g2, b1, b2;
r1 = r2 = g1 = g2 = b1 = b2 = -1;
result = MISSING;
+ /* bu_log("\tbytes[%zu] < stop[%zu\n", bytes, stop_after); */
+
r1 = fgetc(f1);
r2 = fgetc(f2);
bytes++;
- /* stop if we can't even compare a byte */
- if (r1 == r2 && r1 == -1)
- break;
-
if (print_bytes) {
/* replicate */
b1 = g1 = 0;
@@ -416,16 +422,6 @@
printf("%ld\t(%3d, %3d, %3d)\t(%3d, %3d, %3d) %s\n", bytes / 3,
r1, g1, b1, r2, g2, b2, label);
}
}
-
- /* see if we need to terminate prematurely */
- if ((stop_after == (size_t)-1)
- && (feof(f1) || feof(f2))) {
- /* bu_log("exiting because of feof\n"); */
- break;
- } else if (bytes >= stop_after) {
- /* bu_log("exiting because of bytes\n"); */
- break;
- }
}
/* print summary */
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits