plan9fox/sys/src/cmd/sum.c
Ori Bernstein 5bc9b0c3ca improve usage messages (thanks henesy)
Fix inconsistencies between programs and their usage
messages,  correct instances where information seems
to be missing or lost. This  includes missing arguments,
making usage consistent with manuals, and so on.
2020-03-10 10:09:34 -07:00

216 lines
5.4 KiB
C

#include <u.h>
#include <libc.h>
typedef ulong Sumfn(ulong, void*, uvlong);
extern Sumfn sumr, sum5, sum32;
void sumfile(char*, Sumfn*);
static char exitstr[ERRMAX];
void
usage(void)
{
fprint(2, "usage: %s [-5r] [file ...]\n", argv0);
exits("usage");
}
void
main(int argc, char **argv)
{
Sumfn *fn = sum32;
ARGBEGIN{
case 'r':
fn = sumr;
break;
case '5':
fn = sum5;
break;
default:
usage();
break;
}ARGEND
if(*argv){
while(*argv)
sumfile(*argv++, fn);
}else
sumfile(0, fn);
exits(exitstr);
}
void
sumfile(char *file, Sumfn *fn)
{
int fd;
int n;
ulong sum;
uvlong fsize;
char buf[8*1024];
if(file){
if((fd = open(file, OREAD)) < 0){
snprint(exitstr, sizeof(exitstr), "can't open %s: %r", file);
fprint(2, "%s: %s\n", argv0, exitstr);
return;
}
}else
fd = 0;
fsize = 0;
sum = 0;
while((n=read(fd, buf, sizeof buf)) > 0){
fsize += n;
sum = (*fn)(sum, buf, n);
}
if(n < 0){
snprint(exitstr, sizeof(exitstr), "reading %s: %r", file? file:"<stdin>");
fprint(2, "%s: %s\n", argv0, exitstr);
if(file)
close(fd);
return;
}
if(file)
close(fd);
(*fn)(sum, (char*)0, fsize);
if(file)
print(" %s", file);
print("\n");
}
#define VBSIZE 512 /* system v */
ulong
sum5(ulong sum, void *buf, uvlong uvn)
{
uchar *s, *send;
int n;
if(buf == 0){
sum = ((sum>>16)+sum) & 0xFFFF;
print("%.5lud%6lld", sum, (uvn+(VBSIZE-1))/VBSIZE);
return 0;
}
n = uvn;
for(s=buf, send=s+n; s<send; s++)
sum += 0xffff & *s;
return sum;
}
#define RBSIZE 1024 /* research */
ulong
sumr(ulong sum, void *buf, uvlong uvn)
{
uchar *s, *send;
int n;
if(buf == 0){
sum &= 0xFFFF;
print("%.5lud%6lld", sum, (uvn+(RBSIZE-1))/RBSIZE);
return 0;
}
n = uvn;
for(s=buf, send=s+n; s<send; s++)
if(sum & 1)
sum = 0xffff & ((sum>>1)+*s+0x8000);
else
sum = 0xffff & ((sum>>1)+*s);
return sum;
}
extern ulong crc_table[256];
ulong
sum32(ulong lcrc, void *buf, uvlong uvn)
{
uchar *s = buf;
ulong crc = lcrc;
int n;
n = uvn;
if(buf == 0){
char x[4];
x[0] = (n>>24)^0xCC; /* encode the length but make n==0 not 0 */
x[1] = (n>>16)^0x55;
x[2] = (n>>8)^0xCC;
x[3] = (n)^0x55;
crc = sum32(lcrc, x, 4);
print("%.8lux %6lld", crc, uvn);
return 0;
}
while(n-- > 0)
crc = crc_table[(crc^*s++)&0xff] ^ (crc>>8);
return crc;
}
/*
* CRC 035556101440
*/
ulong crc_table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};