changeset 337:aaafa1ceaa91

Add -N, -I, -L, and -P options to cksum.
author Rob Landley <rob@landley.net>
date Mon, 05 Jan 2009 01:05:43 -0600
parents 0c816f5abe22
children a4c26369ec43
files lib/bunzip.c lib/lib.c lib/lib.h toys/cksum.c
diffstat 4 files changed, 29 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/lib/bunzip.c	Sun Jan 04 22:45:03 2009 -0600
+++ b/lib/bunzip.c	Mon Jan 05 01:05:43 2009 -0600
@@ -609,7 +609,7 @@
 		bd->in_fd = src_fd;
 	}
 
-	crc_init(bd->crc32Table);
+	crc_init(bd->crc32Table, 0);
 
 	// Ensure that file starts with "BZh".
     for (i=0;i<3;i++)
--- a/lib/lib.c	Sun Jan 04 22:45:03 2009 -0600
+++ b/lib/lib.c	Mon Jan 05 01:05:43 2009 -0600
@@ -721,15 +721,16 @@
 
 // Create a 256 entry CRC32 lookup table.
 
-void crc_init(unsigned int *crc_table)
+void crc_init(unsigned int *crc_table, int little_endian)
 {
 	unsigned int i;
 
 	// Init the CRC32 table (big endian)
 	for (i=0; i<256; i++) {
-		unsigned int j, c = i<<24;
+		unsigned int j, c = little_endian ? i : i<<24;
 		for (j=8; j; j--)
-			c=c&0x80000000 ? (c<<1)^0x04c11db7 : (c<<1);
+			if (little_endian) c = (c&1) ? (c>>1)^0xEDB88320 : c>>1;
+			else c=c&0x80000000 ? (c<<1)^0x04c11db7 : (c<<1);
 		crc_table[i] = c;
 	}
 }
--- a/lib/lib.h	Sun Jan 04 22:45:03 2009 -0600
+++ b/lib/lib.h	Mon Jan 05 01:05:43 2009 -0600
@@ -96,7 +96,7 @@
 int copy_tempfile(int fdin, char *name, char **tempname);
 void delete_tempfile(int fdin, int fdout, char **tempname);
 void replace_tempfile(int fdin, int fdout, char **tempname);
-void crc_init(unsigned int *crc_table);
+void crc_init(unsigned int *crc_table, int little_endian);
 
 // getmountlist.c
 struct mtab_list {
--- a/toys/cksum.c	Sun Jan 04 22:45:03 2009 -0600
+++ b/toys/cksum.c	Mon Jan 05 01:05:43 2009 -0600
@@ -6,18 +6,21 @@
  *
  * See http://www.opengroup.org/onlinepubs/009695399/utilities/cksum.html
 
-USE_CKSUM(NEWTOY(cksum, "F", TOYFLAG_BIN))
+USE_CKSUM(NEWTOY(cksum, "IPLN", TOYFLAG_BIN))
 
 config CKSUM
 	bool "cksum"
 	default y
 	help
-	  usage: cksum [-F] [file...]
+	  usage: cksum [-FL] [file...]
 
 	  For each file, output crc32 checksum value, length and name of file.
 	  If no files listed, copy from stdin.  Filename "-" is a synonym for stdin.
 
-	  -F	Start with 0xffffffff instead of 0.
+	  -L	Little endian (defaults to big endian)
+	  -P	Skip pre-inversion
+	  -I	Skip post-inversion
+	  -N	No length
 */
 
 #include "toys.h"
@@ -28,16 +31,24 @@
 
 #define TT this.cksum
 
-static unsigned cksum(unsigned crc, unsigned char c)
+static unsigned cksum_be(unsigned crc, unsigned char c)
 {
 	return (crc<<8)^TT.crc_table[(crc>>24)^c];
 }
 
+static unsigned cksum_le(unsigned crc, unsigned char c)
+{
+	return TT.crc_table[(crc^c)&0xff] ^ (crc>>8);
+}
+
 static void do_cksum(int fd, char *name)
 {
-	unsigned crc = toys.optflags ? 0xffffffff : 0;
+	unsigned crc = (toys.optflags&4) ? 0 : 0xffffffff;
 	uint64_t llen = 0, llen2;
+	unsigned (*cksum)(unsigned crc, unsigned char c);
 
+
+	cksum = (toys.optflags&2) ? cksum_le : cksum_be;
 	// CRC the data
 
 	for (;;) {
@@ -57,18 +68,20 @@
 	// CRC the length
 
 	llen2 = llen;
-	while (llen) {
-		crc = cksum(crc, llen);
-		llen >>= 8;
+	if (!(toys.optflags&1)) {
+		while (llen) {
+			crc = cksum(crc, llen);
+			llen >>= 8;
+		}
 	}
 
-	printf("%u %"PRIu64, ~crc, llen2);
+	printf("%u %"PRIu64, (toys.optflags&8) ? crc : ~crc, llen2);
 	if (strcmp("-", name)) printf(" %s", name);
 	xputc('\n');
 }
 
 void cksum_main(void)
 {
-	crc_init(TT.crc_table);
+	crc_init(TT.crc_table, toys.optflags&2);
 	loopfiles(toys.optargs, do_cksum);
 }