Add fletcher16 impl to mescc-tools-extra
This commit is contained in:
parent
e2796e8d57
commit
71505bc8b9
|
@ -87,4 +87,41 @@ hex2 \
|
||||||
-o ${bindir}/chmod \
|
-o ${bindir}/chmod \
|
||||||
--exec_enable
|
--exec_enable
|
||||||
|
|
||||||
|
# fletcher16 command
|
||||||
|
M2-Planet \
|
||||||
|
-f /M2-Planet/test/common_x86/functions/file.c \
|
||||||
|
-f /M2-Planet/test/common_x86/functions/exit.c \
|
||||||
|
-f functions/numerate_number.c \
|
||||||
|
-f functions/string.c \
|
||||||
|
-f functions/file_print.c \
|
||||||
|
-f functions/match.c \
|
||||||
|
-f functions/require.c \
|
||||||
|
-f functions/in_set.c \
|
||||||
|
-f /M2-Planet/functions/calloc.c \
|
||||||
|
-f /M2-Planet/test/common_x86/functions/malloc.c \
|
||||||
|
-f fletcher16.c \
|
||||||
|
--architecture x86 \
|
||||||
|
--debug \
|
||||||
|
-o fletcher16.M1
|
||||||
|
|
||||||
|
blood-elf -f fletcher16.M1 -o fletcher16-footer.M1
|
||||||
|
|
||||||
|
M1 \
|
||||||
|
-f /M2-Planet/test/common_x86/x86_defs.M1 \
|
||||||
|
-f /M2-Planet/test/common_x86/libc-core.M1 \
|
||||||
|
-f fletcher16.M1 \
|
||||||
|
-f fletcher16-footer.M1 \
|
||||||
|
--LittleEndian \
|
||||||
|
--architecture x86 \
|
||||||
|
-o hold
|
||||||
|
|
||||||
|
hex2 \
|
||||||
|
-f /M2-Planet/test/common_x86/ELF-i386-debug.hex2 \
|
||||||
|
-f hold \
|
||||||
|
--LittleEndian \
|
||||||
|
--architecture x86 \
|
||||||
|
--BaseAddress 0x8048000 \
|
||||||
|
-o ${bindir}/fletcher16 \
|
||||||
|
--exec_enable
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define BUF_SIZE 1024
|
||||||
|
// CONSTANT BUF_SIZE 1024
|
||||||
|
#define PATH_MAX 512
|
||||||
|
// CONSTANT PATH_MAX 512
|
||||||
|
|
||||||
|
int fletch16(FILE* fp)
|
||||||
|
{
|
||||||
|
long sum1 = 0;
|
||||||
|
long sum2 = 0;
|
||||||
|
int index;
|
||||||
|
int c = fgetc(fp);
|
||||||
|
while(c != EOF)
|
||||||
|
{
|
||||||
|
sum1 = (sum1 + c) % 255;
|
||||||
|
sum2 = (sum2 + sum1) % 255;
|
||||||
|
c = fgetc(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (sum2 << 8) | sum1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
/* Open the file containing the checksums */
|
||||||
|
FILE* check_fp = fopen(argv[1], "r");
|
||||||
|
require(check_fp != NULL, prepend_string(
|
||||||
|
prepend_string("Error opening checksum file ", argv[1]), "\n"));
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
/* Now loop over each one */
|
||||||
|
FILE* fp;
|
||||||
|
char c;
|
||||||
|
char* filename;
|
||||||
|
char* s_rchecksum;
|
||||||
|
char* file;
|
||||||
|
int rchecksum;
|
||||||
|
int i;
|
||||||
|
int csum;
|
||||||
|
/* It's much easier to just break; out of the loop */
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
filename = calloc(PATH_MAX, sizeof(char));
|
||||||
|
require(filename != NULL, "Failed to allocate filename\n");
|
||||||
|
s_rchecksum = calloc(16, sizeof(char));
|
||||||
|
require(s_rchecksum != NULL, "Failed to allocate filename\n");
|
||||||
|
/* Read the checksum */
|
||||||
|
c = fgetc(check_fp);
|
||||||
|
i = 0;
|
||||||
|
while (c != ' ' && c != EOF)
|
||||||
|
{
|
||||||
|
require(in_set(c, "0123456789"), "Invalid checksum file\n");
|
||||||
|
s_rchecksum[i] = c;
|
||||||
|
c = fgetc(check_fp);
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
if(c == EOF) break;
|
||||||
|
/* Skip the space */
|
||||||
|
c = fgetc(check_fp);
|
||||||
|
/* Read the filename */
|
||||||
|
i = 0;
|
||||||
|
while(c != '\n' && c != EOF)
|
||||||
|
{
|
||||||
|
filename[i] = c;
|
||||||
|
c = fgetc(check_fp);
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
/* If we got here and it is EOF, we probably have all the needed data */
|
||||||
|
/* Convert s_rchecksum -> int */
|
||||||
|
rchecksum = numerate_string(s_rchecksum);
|
||||||
|
|
||||||
|
/* Now let's actually calculate the real checksum */
|
||||||
|
/* Read the file into a char* array */
|
||||||
|
fp = fopen(filename, "r");
|
||||||
|
/* Calculate the checksum! */
|
||||||
|
csum = fletch16(fp);
|
||||||
|
|
||||||
|
/* Compare */
|
||||||
|
if(csum == rchecksum)
|
||||||
|
{
|
||||||
|
file_print(prepend_string(filename, ": OK\n"), stdout);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We failed.. we should fail at the end */
|
||||||
|
rc = 1;
|
||||||
|
file_print(prepend_string(filename, ": FAILED\n"), stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now if we finished the last one, leave */
|
||||||
|
if(c == EOF) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
Loading…
Reference in New Issue