split crc_cycle by endianness
This commit is contained in:
parent
34dc1a8df2
commit
a215f38d6d
3 changed files with 20 additions and 23 deletions
29
crc32.c
29
crc32.c
|
@ -53,27 +53,26 @@ static void crc_fill_table(int big)
|
|||
}
|
||||
}
|
||||
|
||||
static void crc_fill_tables_once()
|
||||
void crc_be_cycle(ulong *remainder, char c)
|
||||
{
|
||||
static char filled = 0;
|
||||
if (crc_big_endian && !(filled & 1)) {
|
||||
ulong byte;
|
||||
if (!filled) {
|
||||
crc_fill_table(1);
|
||||
filled |= 1;
|
||||
} else if (!crc_big_endian && !(filled & 2)) {
|
||||
crc_fill_table(0);
|
||||
filled |= 2;
|
||||
filled = 1;
|
||||
}
|
||||
byte = crc_be_table[((*remainder) >> 24) ^ c];
|
||||
*remainder = (((*remainder) << 8) ^ byte) & 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
void crc_cycle(ulong *remainder, char c)
|
||||
void crc_le_cycle(ulong *remainder, char c)
|
||||
{
|
||||
crc_fill_tables_once();
|
||||
if (crc_big_endian) {
|
||||
const ulong byte = crc_be_table[((*remainder) >> 24) ^ c];
|
||||
*remainder = ((*remainder) << 8) ^ byte;
|
||||
*remainder &= 0xFFFFFFFF;
|
||||
} else {
|
||||
const ulong byte = crc_le_table[((*remainder) ^ c) & 0xFF];
|
||||
static char filled = 0;
|
||||
ulong byte;
|
||||
if (!filled) {
|
||||
crc_fill_table(0);
|
||||
filled = 1;
|
||||
}
|
||||
byte = crc_le_table[((*remainder) ^ c) & 0xFF];
|
||||
*remainder = ((*remainder) >> 8) ^ byte;
|
||||
}
|
||||
}
|
||||
|
|
5
crc32.h
5
crc32.h
|
@ -5,9 +5,8 @@
|
|||
* copy of the license along with this program; see the file LICENSE.
|
||||
*/
|
||||
|
||||
int crc_big_endian;
|
||||
ulong crc_polynomial;
|
||||
|
||||
void crc_cycle(ulong *remainder, char c);
|
||||
void crc_be_cycle(ulong *remainder, char c);
|
||||
void crc_le_cycle(ulong *remainder, char c);
|
||||
ulong crc_reflect(ulong input);
|
||||
|
||||
|
|
9
main.c
9
main.c
|
@ -34,6 +34,7 @@ struct string_node_s {
|
|||
static string_node *input_node = NULL;
|
||||
|
||||
static ulong starting = 0xFFFFFFFF;
|
||||
static char big_endian = 0;
|
||||
static char print_binary = 0;
|
||||
static char xor_output = 1;
|
||||
static char reflect_output = 0;
|
||||
|
@ -72,7 +73,7 @@ static void handle_flag(char flag, char *(*nextarg)())
|
|||
printf(help2);
|
||||
exit(0);
|
||||
case 'e':
|
||||
crc_big_endian = 1;
|
||||
big_endian = 1;
|
||||
return;
|
||||
case 'b':
|
||||
print_binary = 1;
|
||||
|
@ -83,9 +84,6 @@ static void handle_flag(char flag, char *(*nextarg)())
|
|||
case 'r':
|
||||
reflect_output = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (flag) {
|
||||
case 's':
|
||||
next = check_next(flag, nextarg());
|
||||
starting = strtoul(next, NULL, 0);
|
||||
|
@ -132,6 +130,7 @@ static FILE *open_stream(char *filename)
|
|||
static ulong cycle_file(FILE *stream)
|
||||
{
|
||||
ulong remainder = starting;
|
||||
void (*cycle)(ulong*, char) = (big_endian) ? crc_be_cycle : crc_le_cycle;
|
||||
|
||||
int i, len;
|
||||
do {
|
||||
|
@ -142,7 +141,7 @@ static ulong cycle_file(FILE *stream)
|
|||
}
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
crc_cycle(&remainder, buff[i]);
|
||||
cycle(&remainder, buff[i]);
|
||||
} while (!feof(stream));
|
||||
|
||||
if (xor_output)
|
||||
|
|
Loading…
Add table
Reference in a new issue