summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2004-09-03 08:11:34 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2004-09-03 08:11:34 +0000
commit54f4b3ce740928e08beb86e8f578600292dc765d (patch)
tree16f90916c444a343b98c26e532574b2bd233a179
parent0501474249e2d1f1986019570ef58bc1c98d9a89 (diff)
downloadcoreutils-54f4b3ce740928e08beb86e8f578600292dc765d.tar.xz
(usage): "alternated EBCDIC" -> "alternate EBCDIC".
(bit_count): Remove. All uses changed to.... (multiple_bits_set): New function. (scanargs): Use it, and check separately for each set of incompatible options, to improve diagnostics. (MX): Remove. (apply_translations): Move checks for incompatible options to scanargs, so that they're done consistently.
-rw-r--r--src/dd.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/src/dd.c b/src/dd.c
index 7f96a12dc..c1dadfe8b 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -365,7 +365,7 @@ Each CONV symbol may be:\n\
fputs (_("\
ascii from EBCDIC to ASCII\n\
ebcdic from ASCII to EBCDIC\n\
- ibm from ASCII to alternated EBCDIC\n\
+ ibm from ASCII to alternate EBCDIC\n\
block pad newline-terminated records with spaces to cbs-size\n\
unblock replace trailing spaces in cbs-size records with newline\n\
lcase change upper case to lower case\n\
@@ -424,16 +424,12 @@ translate_charset (char const *new_trans)
translation_needed = true;
}
-/* Return the number of 1 bits in `i'. */
+/* Return true if I has more than one bit set. I must be nonnegative. */
-static int
-bit_count (register int i)
+static inline bool
+multiple_bits_set (int i)
{
- register int set_bits;
-
- for (set_bits = 0; i != 0; set_bits++)
- i &= i - 1;
- return set_bits;
+ return (i & (i - 1)) != 0;
}
static void
@@ -725,7 +721,13 @@ scanargs (int argc, char **argv)
if (input_flags & (O_DSYNC | O_SYNC))
input_flags |= O_RSYNC;
- if ((conversions_mask & (C_EXCL | C_NOCREAT)) == (C_EXCL | C_NOCREAT))
+ if (multiple_bits_set (conversions_mask & (C_ASCII | C_EBCDIC | C_IBM)))
+ error (EXIT_FAILURE, 0, _("cannot combine any two of {ascii,ebcdic,ibm}"));
+ if (multiple_bits_set (conversions_mask & (C_BLOCK | C_UNBLOCK)))
+ error (EXIT_FAILURE, 0, _("cannot combine block and unblock"));
+ if (multiple_bits_set (conversions_mask & (C_LCASE | C_UCASE)))
+ error (EXIT_FAILURE, 0, _("cannot combine lcase and ucase"));
+ if (multiple_bits_set (conversions_mask & (C_EXCL | C_NOCREAT)))
error (EXIT_FAILURE, 0, _("cannot combine excl and nocreat"));
}
@@ -736,16 +738,6 @@ apply_translations (void)
{
int i;
-#define MX(a) (bit_count (conversions_mask & (a)))
- if ((MX (C_ASCII | C_EBCDIC | C_IBM) > 1)
- || (MX (C_BLOCK | C_UNBLOCK) > 1)
- || (MX (C_LCASE | C_UCASE) > 1))
- {
- error (EXIT_FAILURE, 0, _("\
- only one conv in {ascii,ebcdic,ibm}, {lcase,ucase}, {block,unblock}"));
- }
-#undef MX
-
if (conversions_mask & C_ASCII)
translate_charset (ebcdic_to_ascii);