diff options
author | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
---|---|---|
committer | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
commit | 03261851a10dd2d6900a0a00a7515a0a46fb5d76 (patch) | |
tree | 7c22ac6cbbc99fd5cd1b5426853be8d4fd7bfcf1 /libgloss/hp74x/checksum.c | |
parent | fae4c299f14fc23e2829c8656992eba21f79242a (diff) | |
download | cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.gz cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.bz2 cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.zip |
20000317 sourceware import
Diffstat (limited to 'libgloss/hp74x/checksum.c')
-rw-r--r-- | libgloss/hp74x/checksum.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/libgloss/hp74x/checksum.c b/libgloss/hp74x/checksum.c new file mode 100644 index 000000000..4a2b331fe --- /dev/null +++ b/libgloss/hp74x/checksum.c @@ -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 |