From 03261851a10dd2d6900a0a00a7515a0a46fb5d76 Mon Sep 17 00:00:00 2001 From: Ranjith Kumaran Date: Fri, 17 Mar 2000 22:48:54 +0000 Subject: 20000317 sourceware import --- libgloss/hp74x/checksum.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 libgloss/hp74x/checksum.c (limited to 'libgloss/hp74x/checksum.c') 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 +#include + +#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 -- cgit v1.2.3