20000317 sourceware import
This commit is contained in:
150
libgloss/hp74x/checksum.c
Normal file
150
libgloss/hp74x/checksum.c
Normal file
@@ -0,0 +1,150 @@
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define USAGE "USAGE: checkum -[vhcs] infile outfile\n\t-v\tverbose\n\
|
||||
\t-h\thelp\n\t-c\tcheck checksum\n\t-s\tprint the ipl size"
|
||||
static int verbose = 0;
|
||||
static int verify = 0;
|
||||
static int size = 0;
|
||||
|
||||
typedef int word_t;
|
||||
#define WORDSIZE (sizeof(word_t))
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
char *infile;
|
||||
char *outfile;
|
||||
int infd;
|
||||
int outfd;
|
||||
word_t checksum = 0;
|
||||
int nbytes;
|
||||
word_t buf;
|
||||
int i = 1;
|
||||
int filesize = 0;
|
||||
|
||||
while (*argv[i] == '-') {
|
||||
switch (*(argv[i]+1)) {
|
||||
case 'v':
|
||||
verbose++;
|
||||
break;
|
||||
case 'c':
|
||||
verify++;
|
||||
puts ("Sorry, unimplemented for now");
|
||||
exit(1);
|
||||
break;
|
||||
case 's':
|
||||
size++;
|
||||
break;
|
||||
case 'h':
|
||||
puts (USAGE);
|
||||
exit(0);
|
||||
default:
|
||||
printf ("\"%s\", Illegal option\n", argv[i]);
|
||||
puts (USAGE);
|
||||
exit(1);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
infile = *(argv + i);
|
||||
outfile = *(argv + i+1);
|
||||
|
||||
/* see it there were file names on the command line */
|
||||
if (infile == 0x0) {
|
||||
puts("Didn't specify an input file name");
|
||||
exit(1);
|
||||
}
|
||||
if (outfile == 0x0) {
|
||||
puts("Didn't specify an output file name");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* try to open the files */
|
||||
infd = open(infile, O_RDONLY);
|
||||
if (infd == -1) {
|
||||
printf("Couldn't open %s\n", infile);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
outfd = open(outfile, O_WRONLY|O_CREAT|O_TRUNC);
|
||||
if (outfd == -1) {
|
||||
printf("Couldn't open %s\n", outfile);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (verbose > 2)
|
||||
putchar('\n');
|
||||
|
||||
/* calculate the checksum */
|
||||
while ((nbytes = read(infd, &buf, WORDSIZE)) == WORDSIZE) {
|
||||
if (verbose > 2)
|
||||
putchar('.');
|
||||
checksum+= buf;
|
||||
filesize+= WORDSIZE;
|
||||
if (write(outfd, &buf, WORDSIZE) != WORDSIZE) {
|
||||
puts("Couldn't write");
|
||||
}
|
||||
if (verbose > 3)
|
||||
putchar('+');
|
||||
}
|
||||
if (verbose > 2)
|
||||
putchar('\n');
|
||||
|
||||
/* write the last byte read */
|
||||
if (nbytes > 0) {
|
||||
write(outfd, &buf, nbytes);
|
||||
checksum+= buf; /* calculate the last word */
|
||||
filesize+= nbytes;
|
||||
}
|
||||
/* write the checksum */
|
||||
buf = -checksum;
|
||||
write(outfd, &buf, WORDSIZE);
|
||||
filesize+= WORDSIZE; /* checksum increase the size */
|
||||
|
||||
if (verbose > 0)
|
||||
printf("The calculated checksum is:\n\t0x%x,\n\t%u\n", -checksum, -checksum);
|
||||
|
||||
/* calculate the extra 2K here */
|
||||
buf = 0;
|
||||
while ((filesize % 2048) !=0) {
|
||||
filesize+=WORDSIZE;
|
||||
write(outfd, &buf, WORDSIZE);
|
||||
}
|
||||
if (size > 0) {
|
||||
printf ("%u is the new file size\n", filesize);
|
||||
}
|
||||
close(outfd);
|
||||
close(infd);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Calculate a simple checksum and concatenate it to the end of BUF. */
|
||||
void
|
||||
compute_and_concatenate_checksum (word *buf, size_t bufsize_in_words)
|
||||
{
|
||||
size_t i;
|
||||
word sum;
|
||||
sum = buf[0]
|
||||
for (i = 1; i < bufsize_in_words; i++)
|
||||
sum += buf[i];
|
||||
buf[bufsize_in_words] = -sum;
|
||||
}
|
||||
|
||||
/* Calculate a simple checksum and verify it. NOTE: bufsize_in_words should
|
||||
include the checksum, i.e., it should be one larger than when the
|
||||
checksum was calculated using compute_and_concatenate_checksum! */
|
||||
int
|
||||
compute_and_and_verify_checksum (word *buf, size_t bufsize_in_words)
|
||||
{
|
||||
size_t i;
|
||||
word sum;
|
||||
sum = buf[0];
|
||||
for (i = 1; i < bufsize_in_words; i++)
|
||||
sum += buf[i];
|
||||
if (sum != 0)
|
||||
return ERROR;
|
||||
return SUCCESS;
|
||||
}
|
||||
#endif
|
Reference in New Issue
Block a user