64-bit: Fix CRC on 64-bit systems by using 32-bit types.

This commit is contained in:
Arvid Norlander 2022-09-29 22:37:48 +02:00
parent f980b8a9a9
commit 0b9ba9ae5d
No known key found for this signature in database
GPG Key ID: E824A8E5D8D29AA0
13 changed files with 70 additions and 61 deletions

View File

@ -1,10 +1,9 @@
#include <stdio.h> #include <stdio.h>
#include "../fileio/machdr.h" #include "../fileio/machdr.h"
#include "../fileio/rdfile.h" #include "../fileio/rdfile.h"
#include "../crc/crc.h"
extern int dorep; extern int dorep;
extern unsigned long binhex_crcinit;
extern unsigned long binhex_updcrc();
#define RUNCHAR 0x90 #define RUNCHAR 0x90
@ -43,35 +42,35 @@ void dofile()
void doheader() void doheader()
{ {
unsigned long crc; uint32_t crc;
int i, n; int i, n;
crc = binhex_crcinit; crc = binhex_crcinit;
n = file_info[I_NAMEOFF]; n = file_info[I_NAMEOFF];
crc = binhex_updcrc(crc, file_info + I_NAMEOFF, n + 1); crc = binhex_updcrc(crc, (unsigned char*)(file_info + I_NAMEOFF), n + 1);
for(i = 0; i <= n; i++) { for(i = 0; i <= n; i++) {
outbyte(file_info[I_NAMEOFF + i]); outbyte(file_info[I_NAMEOFF + i]);
} }
n = 0; n = 0;
crc = binhex_updcrc(crc, (char *)&n, 1); crc = binhex_updcrc(crc, (unsigned char *)&n, 1);
outbyte(0); outbyte(0);
crc = binhex_updcrc(crc, file_info + I_TYPEOFF, 4); crc = binhex_updcrc(crc, (unsigned char*)(file_info + I_TYPEOFF), 4);
for(i = 0; i < 4; i++) { for(i = 0; i < 4; i++) {
outbyte(file_info[I_TYPEOFF + i]); outbyte(file_info[I_TYPEOFF + i]);
} }
crc = binhex_updcrc(crc, file_info + I_AUTHOFF, 4); crc = binhex_updcrc(crc, (unsigned char*)(file_info + I_AUTHOFF), 4);
for(i = 0; i < 4; i++) { for(i = 0; i < 4; i++) {
outbyte(file_info[I_AUTHOFF + i]); outbyte(file_info[I_AUTHOFF + i]);
} }
crc = binhex_updcrc(crc, file_info + I_FLAGOFF, 2); crc = binhex_updcrc(crc, (unsigned char*)(file_info + I_FLAGOFF), 2);
for(i = 0; i < 2; i++) { for(i = 0; i < 2; i++) {
outbyte(file_info[I_FLAGOFF + i]); outbyte(file_info[I_FLAGOFF + i]);
} }
crc = binhex_updcrc(crc, file_info + I_DLENOFF, 4); crc = binhex_updcrc(crc, (unsigned char*)(file_info + I_DLENOFF), 4);
for(i = 0; i < 4; i++) { for(i = 0; i < 4; i++) {
outbyte(file_info[I_DLENOFF + i]); outbyte(file_info[I_DLENOFF + i]);
} }
crc = binhex_updcrc(crc, file_info + I_RLENOFF, 4); crc = binhex_updcrc(crc, (unsigned char*)(file_info + I_RLENOFF), 4);
for(i = 0; i < 4; i++) { for(i = 0; i < 4; i++) {
outbyte(file_info[I_RLENOFF + i]); outbyte(file_info[I_RLENOFF + i]);
} }
@ -83,10 +82,10 @@ void dofork(fork, size)
char *fork; char *fork;
int size; int size;
{ {
unsigned long crc; uint32_t crc;
int i; int i;
crc = binhex_updcrc(binhex_crcinit, fork, size); crc = binhex_updcrc(binhex_crcinit, (unsigned char*)fork, size);
for(i = 0; i < size; i++) { for(i = 0; i < size; i++) {
outbyte(fork[i]); outbyte(fork[i]);
} }

14
crc/crc.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef CRC_CRC_H
#define CRC_CRC_H
#include <stdint.h>
extern uint32_t arc_crcinit;
extern uint32_t binhex_crcinit;
extern uint32_t zip_crcinit;
extern uint32_t arc_updcrc(uint32_t icrc, unsigned char *icp, int32_t icnt);
extern uint32_t binhex_updcrc(uint32_t icrc, unsigned char *icp, int32_t icnt);
extern uint32_t zip_updcrc(uint32_t icrc, unsigned char *icp, int32_t icnt);
#endif

View File

@ -64,12 +64,13 @@ int poly, init, swapped, bits;
(void)fprintf(stderr, "Cannot open %s for writing\n", buf); (void)fprintf(stderr, "Cannot open %s for writing\n", buf);
exit(1); exit(1);
} }
(void)fprintf(fd, "unsigned long %s_crcinit = %d;\n", name, init); (void)fprintf(fd, "#include \"crc.h\"\n");
(void)fprintf(fd, "uint32_t %s_crcinit = %d;\n", name, init);
(void)fprintf(fd, "\n"); (void)fprintf(fd, "\n");
if(bits == 16) { if(bits == 16) {
(void)fprintf(fd, "static unsigned short crctab[256] = {\n"); (void)fprintf(fd, "static uint16_t crctab[256] = {\n");
} else { } else {
(void)fprintf(fd, "static unsigned long crctab[256] = {\n"); (void)fprintf(fd, "static uint32_t crctab[256] = {\n");
} }
(void)fprintf(fd, " "); (void)fprintf(fd, " ");
if(bits == 16) { if(bits == 16) {
@ -109,7 +110,7 @@ int poly, init, swapped, bits;
} }
(void)fprintf(fd, "};\n"); (void)fprintf(fd, "};\n");
(void)fprintf(fd, "\n"); (void)fprintf(fd, "\n");
(void)fprintf(fd, "unsigned long %s_updcrc(unsigned long icrc, unsigned char *icp, int icnt)\n", name); (void)fprintf(fd, "uint32_t %s_updcrc(uint32_t icrc, unsigned char *icp, int32_t icnt)\n", name);
(void)fprintf(fd, "{\n"); (void)fprintf(fd, "{\n");
if(bits == 16) { if(bits == 16) {
(void)fprintf(fd, "#define M1 0xff\n"); (void)fprintf(fd, "#define M1 0xff\n");
@ -118,9 +119,9 @@ int poly, init, swapped, bits;
(void)fprintf(fd, "#define M1 0xffffff\n"); (void)fprintf(fd, "#define M1 0xffffff\n");
(void)fprintf(fd, "#define M2 0xffffff00\n"); (void)fprintf(fd, "#define M2 0xffffff00\n");
} }
(void)fprintf(fd, " register unsigned long crc = icrc;\n"); (void)fprintf(fd, " register uint32_t crc = icrc;\n");
(void)fprintf(fd, " register unsigned char *cp = icp;\n"); (void)fprintf(fd, " register unsigned char *cp = icp;\n");
(void)fprintf(fd, " register int cnt = icnt;\n"); (void)fprintf(fd, " register int32_t cnt = icnt;\n");
(void)fprintf(fd, "\n"); (void)fprintf(fd, "\n");
(void)fprintf(fd, " while(cnt--) {\n"); (void)fprintf(fd, " while(cnt--) {\n");
if(bits == 16) { if(bits == 16) {

View File

@ -8,7 +8,7 @@
extern void exit(); extern void exit();
unsigned long crc; uint32_t crc;
#ifdef HQX #ifdef HQX
void comp_q_crc(c) void comp_q_crc(c)

View File

@ -1,10 +1,10 @@
#define INITCRC binhex_crcinit #define INITCRC binhex_crcinit
extern unsigned long crc; #include "../crc/crc.h"
extern unsigned long binhex_crcinit;
extern unsigned long binhex_updcrc();
extern void comp_q_crc(); extern uint32_t crc;
extern void comp_q_crc_n();
extern void verify_crc(); extern void comp_q_crc (register unsigned int c);
extern void comp_q_crc_n (register unsigned char *s, register unsigned char *e);
extern void verify_crc (unsigned long calc_crc, unsigned long file_crc);

View File

@ -92,11 +92,11 @@ void cpt()
#endif /* SCAN */ #endif /* SCAN */
exit(1); exit(1);
} }
cpt_crc = (*updcrc)(cpt_crc, cptptr, cpthdr.commentsize); cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)cptptr, cpthdr.commentsize);
for(i = 0; i < cpthdr.entries; i++) { for(i = 0; i < cpthdr.entries; i++) {
*cptptr = getc(infp); *cptptr = getc(infp);
cpt_crc = (*updcrc)(cpt_crc, cptptr, 1); cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)cptptr, 1);
if(*cptptr & 0x80) { if(*cptptr & 0x80) {
cptptr[F_FOLDER] = 1; cptptr[F_FOLDER] = 1;
*cptptr &= 0x3f; *cptptr &= 0x3f;
@ -110,7 +110,7 @@ void cpt()
#endif /* SCAN */ #endif /* SCAN */
exit(1); exit(1);
} }
cpt_crc = (*updcrc)(cpt_crc, cptptr + 1, *cptptr); cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)(cptptr + 1), *cptptr);
if(cptptr[F_FOLDER]) { if(cptptr[F_FOLDER]) {
if(fread(cptptr + F_FOLDERSIZE, 1, 2, infp) != 2) { if(fread(cptptr + F_FOLDERSIZE, 1, 2, infp) != 2) {
(void)fprintf(stderr, "Can't read file header #%d\n", i+1); (void)fprintf(stderr, "Can't read file header #%d\n", i+1);
@ -119,7 +119,7 @@ void cpt()
#endif /* SCAN */ #endif /* SCAN */
exit(1); exit(1);
} }
cpt_crc = (*updcrc)(cpt_crc, cptptr + F_FOLDERSIZE, 2); cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)(cptptr + F_FOLDERSIZE), 2);
} else { } else {
if(fread(cptptr + F_VOLUME, 1, FILEHDRSIZE - F_VOLUME, infp) != if(fread(cptptr + F_VOLUME, 1, FILEHDRSIZE - F_VOLUME, infp) !=
FILEHDRSIZE - F_VOLUME) { FILEHDRSIZE - F_VOLUME) {
@ -129,7 +129,7 @@ void cpt()
#endif /* SCAN */ #endif /* SCAN */
exit(1); exit(1);
} }
cpt_crc = (*updcrc)(cpt_crc, cptptr + F_VOLUME, cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)(cptptr + F_VOLUME),
FILEHDRSIZE - F_VOLUME); FILEHDRSIZE - F_VOLUME);
} }
cptptr += FILEHDRSIZE; cptptr += FILEHDRSIZE;
@ -203,7 +203,7 @@ struct cptHdr *s;
return 0; return 0;
} }
cpt_crc = (*updcrc)(cpt_crc, temp + CPTHDRSIZE + C_ENTRIES, 3); cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)(temp + CPTHDRSIZE + C_ENTRIES), 3);
s->hdrcrc = get4(temp + CPTHDRSIZE + C_HDRCRC); s->hdrcrc = get4(temp + CPTHDRSIZE + C_HDRCRC);
s->entries = get2(temp + CPTHDRSIZE + C_ENTRIES); s->entries = get2(temp + CPTHDRSIZE + C_ENTRIES);
s->commentsize = temp[CPTHDRSIZE + C_COMMENT]; s->commentsize = temp[CPTHDRSIZE + C_COMMENT];
@ -415,7 +415,7 @@ unsigned short type;
} else { } else {
cpt_rle_lzh(); cpt_rle_lzh();
} }
cpt_crc = (*updcrc)(cpt_crc, out_buffer, obytes); cpt_crc = (*updcrc)(cpt_crc, (unsigned char*)out_buffer, obytes);
} }
void cpt_wrfile1(in_char, ibytes, obytes, type, blocksize) void cpt_wrfile1(in_char, ibytes, obytes, type, blocksize)

View File

@ -1,4 +1,6 @@
unsigned long crcinit; #include "crc.h"
unsigned long (*updcrc)(); uint32_t crcinit;
uint32_t (*updcrc)(uint32_t icrc, unsigned char *icp, int32_t icnt);

View File

@ -1,13 +1,6 @@
#define INIT_CRC crcinit #define INIT_CRC crcinit
extern unsigned long arc_crcinit; #include "../crc/crc.h"
extern unsigned long binhex_crcinit;
extern unsigned long zip_crcinit;
extern unsigned long arc_updcrc(unsigned long icrc, unsigned char *icp, int icnt);
extern unsigned long binhex_updcrc(unsigned long icrc, unsigned char *icp, int icnt);
extern unsigned long zip_updcrc(unsigned long icrc, unsigned char *icp, int icnt);
extern unsigned long crcinit;
extern unsigned long (*updcrc)();
extern uint32_t crcinit;
extern uint32_t (*updcrc)(uint32_t icrc, unsigned char *icp, int32_t icnt);

View File

@ -151,7 +151,7 @@ void dd_arch(bin_hdr)
unsigned char *bin_hdr; unsigned char *bin_hdr;
{ {
unsigned long data_size; unsigned long data_size;
unsigned long crc, filecrc; uint32_t crc, filecrc;
struct fileHdr f; struct fileHdr f;
struct fileCHdr cf; struct fileCHdr cf;
char locname[64]; char locname[64];
@ -322,7 +322,7 @@ struct fileCHdr *cf;
int skip; int skip;
{ {
register int i; register int i;
unsigned long crc; uint32_t crc;
int n, to_uncompress; int n, to_uncompress;
unsigned char *hdr; unsigned char *hdr;
char ftype[5], fauth[5]; char ftype[5], fauth[5];
@ -428,7 +428,7 @@ int skip;
static void dd_cfilehdr(f) static void dd_cfilehdr(f)
struct fileCHdr *f; struct fileCHdr *f;
{ {
unsigned long crc; uint32_t crc;
unsigned char *hdr; unsigned char *hdr;
hdr = dd_data_ptr; hdr = dd_data_ptr;

View File

@ -368,7 +368,7 @@ int method;
int rsrcLength, dataLength; int rsrcLength, dataLength;
int doit; int doit;
char *mname; char *mname;
unsigned long crc; uint32_t crc;
if(filehdr->upsize > lzh_filesize) { if(filehdr->upsize > lzh_filesize) {
if(lzh_filesize == 0) { if(lzh_filesize == 0) {
@ -557,7 +557,7 @@ int method;
} }
} }
if(doit) { if(doit) {
crc = (*updcrc)(INIT_CRC, lzh_file, filehdr->upsize); crc = (*updcrc)(INIT_CRC, (unsigned char*)lzh_file, filehdr->upsize);
if(filehdr->crc != crc) { if(filehdr->crc != crc) {
(void)fprintf(stderr, (void)fprintf(stderr,
"CRC error on file: need 0x%04x, got 0x%04x\n", "CRC error on file: need 0x%04x, got 0x%04x\n",

View File

@ -122,10 +122,10 @@ void pit()
start_info(info, filehdr.rlen, filehdr.dlen); start_info(info, filehdr.rlen, filehdr.dlen);
start_data(); start_data();
pit_wrfile(filehdr.dlen, decode); pit_wrfile(filehdr.dlen, decode);
data_crc = (*updcrc)(INIT_CRC, out_buffer, filehdr.dlen); data_crc = (*updcrc)(INIT_CRC, (unsigned char*)out_buffer, filehdr.dlen);
start_rsrc(); start_rsrc();
pit_wrfile(filehdr.rlen, decode); pit_wrfile(filehdr.rlen, decode);
data_crc = (*updcrc)(data_crc, out_buffer, filehdr.rlen); data_crc = (*updcrc)(data_crc, (unsigned char*)out_buffer, filehdr.rlen);
if(decode == nocomp) { if(decode == nocomp) {
crc = getb(infp); crc = getb(infp);
crc = (crc << 8) | getb(infp); crc = (crc << 8) | getb(infp);
@ -164,7 +164,7 @@ struct pit_header *f;
int compr; int compr;
{ {
register int i; register int i;
unsigned long crc; uint32_t crc;
int n; int n;
char hdr[HDRBYTES]; char hdr[HDRBYTES];
char ftype[5], fauth[5]; char ftype[5], fauth[5];
@ -182,7 +182,7 @@ int compr;
} }
} }
crc = INIT_CRC; crc = INIT_CRC;
crc = (*updcrc)(crc, hdr, HDRBYTES - 2); crc = (*updcrc)(crc, (unsigned char*)hdr, HDRBYTES - 2);
f->hdrCRC = get2(hdr + H_HDRCRC); f->hdrCRC = get2(hdr + H_HDRCRC);
if(f->hdrCRC != crc) { if(f->hdrCRC != crc) {

View File

@ -157,7 +157,7 @@ static int readsithdr(sitHdr *s)
static int sit_filehdr(struct fileHdr *f, int skip) static int sit_filehdr(struct fileHdr *f, int skip)
{ {
register int i; register int i;
unsigned long crc; uint32_t crc;
int n; int n;
char hdr[FILEHDRSIZE]; char hdr[FILEHDRSIZE];
char ftype[5], fauth[5]; char ftype[5], fauth[5];
@ -170,7 +170,7 @@ static int sit_filehdr(struct fileHdr *f, int skip)
return -1; return -1;
} }
crc = INIT_CRC; crc = INIT_CRC;
crc = (*updcrc)(crc, hdr, FILEHDRSIZE - 2); crc = (*updcrc)(crc, (unsigned char*)hdr, FILEHDRSIZE - 2);
f->hdrCRC = get2(hdr + F_HDRCRC); f->hdrCRC = get2(hdr + F_HDRCRC);
if(f->hdrCRC != crc) { if(f->hdrCRC != crc) {
@ -390,7 +390,7 @@ char *name;
static void sit_unstuff(filehdr) static void sit_unstuff(filehdr)
struct fileHdr filehdr; struct fileHdr filehdr;
{ {
unsigned long crc; uint32_t crc;
if(write_it) { if(write_it) {
start_info(info, filehdr.rsrcLength, filehdr.dataLength); start_info(info, filehdr.rsrcLength, filehdr.dataLength);
@ -403,7 +403,7 @@ struct fileHdr filehdr;
} }
sit_wrfile(filehdr.compRLength, filehdr.rsrcLength, filehdr.compRMethod); sit_wrfile(filehdr.compRLength, filehdr.rsrcLength, filehdr.compRMethod);
if(write_it) { if(write_it) {
crc = (*updcrc)(INIT_CRC, out_buffer, filehdr.rsrcLength); crc = (*updcrc)(INIT_CRC, (unsigned char*)out_buffer, filehdr.rsrcLength);
if(filehdr.rsrcCRC != crc) { if(filehdr.rsrcCRC != crc) {
(void)fprintf(stderr, (void)fprintf(stderr,
"CRC error on resource fork: need 0x%04x, got 0x%04x\n", "CRC error on resource fork: need 0x%04x, got 0x%04x\n",
@ -422,7 +422,7 @@ struct fileHdr filehdr;
} }
sit_wrfile(filehdr.compDLength, filehdr.dataLength, filehdr.compDMethod); sit_wrfile(filehdr.compDLength, filehdr.dataLength, filehdr.compDMethod);
if(write_it) { if(write_it) {
crc = (*updcrc)(INIT_CRC, out_buffer, filehdr.dataLength); crc = (*updcrc)(INIT_CRC, (unsigned char*)out_buffer, filehdr.dataLength);
if(filehdr.dataCRC != crc) { if(filehdr.dataCRC != crc) {
(void)fprintf(stderr, (void)fprintf(stderr,
"CRC error on data fork: need 0x%04x, got 0x%04x\n", "CRC error on data fork: need 0x%04x, got 0x%04x\n",

View File

@ -274,7 +274,7 @@ struct fileHdr fhdr;
static void zma_mooz(filehdr) static void zma_mooz(filehdr)
struct fileHdr filehdr; struct fileHdr filehdr;
{ {
unsigned long crc; uint32_t crc;
if(write_it) { if(write_it) {
start_info(info, filehdr.rsrcLength, filehdr.dataLength); start_info(info, filehdr.rsrcLength, filehdr.dataLength);
@ -287,7 +287,7 @@ struct fileHdr filehdr;
} }
zma_wrfile(filehdr.compDLength, filehdr.dataLength, filehdr.what); zma_wrfile(filehdr.compDLength, filehdr.dataLength, filehdr.what);
if(write_it) { if(write_it) {
crc = (*updcrc)(INIT_CRC, out_buffer, filehdr.dataLength); crc = (*updcrc)(INIT_CRC, (unsigned char*)out_buffer, filehdr.dataLength);
if(filehdr.dataCRC != crc) { if(filehdr.dataCRC != crc) {
(void)fprintf(stderr, (void)fprintf(stderr,
"CRC error on data fork: need 0x%04x, got 0x%04x\n", "CRC error on data fork: need 0x%04x, got 0x%04x\n",
@ -306,7 +306,7 @@ struct fileHdr filehdr;
} }
zma_wrfile(filehdr.compRLength, filehdr.rsrcLength, filehdr.what); zma_wrfile(filehdr.compRLength, filehdr.rsrcLength, filehdr.what);
if(write_it) { if(write_it) {
crc = (*updcrc)(INIT_CRC, out_buffer, filehdr.rsrcLength); crc = (*updcrc)(INIT_CRC, (unsigned char*)out_buffer, filehdr.rsrcLength);
if(filehdr.rsrcCRC != crc) { if(filehdr.rsrcCRC != crc) {
(void)fprintf(stderr, (void)fprintf(stderr,
"CRC error on resource fork: need 0x%04x, got 0x%04x\n", "CRC error on resource fork: need 0x%04x, got 0x%04x\n",