Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/hp74x/checksum.c')
-rw-r--r--libgloss/hp74x/checksum.c150
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