On Tue, Nov 04, 2003 at 05:50:31PM -0800, Paul Eggert wrote:
> Surely it should use the least common multiple of the two block sizes?
>
> (Checking for overflow, of course.)
Hello Paul,
Thanks for your feedback. From an organizational standpoint, is it
appropriate to re-use the lcm routine residing in od.c in the
following manner?
Best regards,
-Neill.
diff -N -P -r -u coreutils-5.0.91/src/copy.c coreutils-5.0.91-patched/src/copy.c
--- coreutils-5.0.91/src/copy.c 2003-08-30 10:57:32.000000000 -0500
+++ coreutils-5.0.91-patched/src/copy.c 2003-11-05 16:53:51.000000000 -0600
@@ -189,6 +189,33 @@
return -ret;
}
+/* Compute the greatest common denominator of U and V
+ using Euclid's algorithm. */
+
+static unsigned int
+gcd (unsigned int u, unsigned int v)
+{
+ unsigned int t;
+ while (v != 0)
+ {
+ t = u % v;
+ u = v;
+ v = t;
+ }
+ return u;
+}
+
+/* Compute the least common multiple of U and V. */
+
+static unsigned int
+lcm (unsigned int u, unsigned int v)
+{
+ unsigned int t = gcd (u, v);
+ if ((t == 0) || (u > (UINT_MAX / v)))
+ return 0;
+ return u * v / t;
+}
+
/* Copy a regular file from SRC_PATH to DST_PATH.
If the source file contains holes, copies holes and blocks of zeros
in the source file as holes in the destination file.
@@ -216,6 +243,8 @@
off_t n_read_total = 0;
int last_write_made_hole = 0;
int make_holes = (x->sparse_mode == SPARSE_ALWAYS);
+ unsigned int max_block_size = 0;
+ unsigned int min_block_size = 0;
source_desc = open (src_path, O_RDONLY);
if (source_desc < 0)
@@ -285,7 +314,23 @@
goto close_src_and_dst_desc;
}
- buf_size = ST_BLKSIZE (sb);
+ if (ST_BLKSIZE (sb) < ST_BLKSIZE (src_open_sb))
+ {
+ min_block_size = ST_BLKSIZE (sb);
+ max_block_size = ST_BLKSIZE (src_open_sb);
+ }
+ else
+ {
+ min_block_size = ST_BLKSIZE (src_open_sb);
+ max_block_size = ST_BLKSIZE (sb);
+ }
+
+ buf_size = lcm (min_block_size, max_block_size);
+ if (buf_size < 1)
+ {
+ buf_size = (((max_block_size % min_block_size) == 0) ?
+ max_block_size : min_block_size);
+ }
#if HAVE_STRUCT_STAT_ST_BLOCKS
if (x->sparse_mode == SPARSE_AUTO && S_ISREG (sb.st_mode))
_______________________________________________
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils