ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Convert-UUlib/uulib/crc32.c
(Generate patch)

Comparing Convert-UUlib/uulib/crc32.c (file contents):
Revision 1.5 by root, Thu Feb 27 17:20:58 2020 UTC vs.
Revision 1.6 by root, Mon Mar 2 22:23:10 2020 UTC

687} 687}
688 688
689/* merge two CRC32 such that result = crc32(dataB, lengthB, crc32(dataA, lengthA)) */ 689/* merge two CRC32 such that result = crc32(dataB, lengthB, crc32(dataA, lengthA)) */
690uint32_t uu_crc32_combine(uint32_t crcA, uint32_t crcB, size_t lengthB) 690uint32_t uu_crc32_combine(uint32_t crcA, uint32_t crcB, size_t lengthB)
691{ 691{
692 int i;
692 /* 693 /*
693 * based on Mark Adler's crc_combine from 694 * based on Mark Adler's crc_combine from
694 * https://github.com/madler/pigz/blob/master/pigz.c 695 * https://github.com/madler/pigz/blob/master/pigz.c
695 696
696 * main idea: 697 * main idea:
728 uint32_t odd [CrcBits]; /* odd-power-of-two zeros operator */ 729 uint32_t odd [CrcBits]; /* odd-power-of-two zeros operator */
729 uint32_t even[CrcBits]; /* even-power-of-two zeros operator */ 730 uint32_t even[CrcBits]; /* even-power-of-two zeros operator */
730 731
731 /* put operator for one zero bit in odd */ 732 /* put operator for one zero bit in odd */
732 odd[0] = Polynomial; 733 odd[0] = Polynomial;
733 for (int i = 1; i < CrcBits; i++) 734 for (i = 1; i < CrcBits; i++)
734 odd[i] = 1 << (i - 1); 735 odd[i] = 1 << (i - 1);
735 736
736 /* put operator for two zero bits in even */ 737 /* put operator for two zero bits in even */
737 /* same as gf2_matrix_square(even, odd); */ 738 /* same as gf2_matrix_square(even, odd); */
738 for (int i = 0; i < CrcBits; i++) 739 for (i = 0; i < CrcBits; i++)
739 { 740 {
741 int j;
740 uint32_t vec = odd[i]; 742 uint32_t vec = odd[i];
741 even[i] = 0; 743 even[i] = 0;
742 for (int j = 0; vec != 0; j++, vec >>= 1) 744 for (j = 0; vec != 0; j++, vec >>= 1)
743 if (vec & 1) 745 if (vec & 1)
744 even[i] ^= odd[j]; 746 even[i] ^= odd[j];
745 } 747 }
746 /* put operator for four zero bits in odd */ 748 /* put operator for four zero bits in odd */
747 /* same as gf2_matrix_square(odd, even); */ 749 /* same as gf2_matrix_square(odd, even); */
748 for (int i = 0; i < CrcBits; i++) 750 for (i = 0; i < CrcBits; i++)
749 { 751 {
752 int j;
750 uint32_t vec = even[i]; 753 uint32_t vec = even[i];
751 odd[i] = 0; 754 odd[i] = 0;
752 for (int j = 0; vec != 0; j++, vec >>= 1) 755 for (j = 0; vec != 0; j++, vec >>= 1)
753 if (vec & 1) 756 if (vec & 1)
754 odd[i] ^= even[j]; 757 odd[i] ^= even[j];
755 } 758 }
756 759
757 /* the following loop becomes much shorter if I keep swapping even and odd */ 760 /* the following loop becomes much shorter if I keep swapping even and odd */
759 uint32_t* b = odd; 762 uint32_t* b = odd;
760 /* apply secondLength zeros to firstCrc32 */ 763 /* apply secondLength zeros to firstCrc32 */
761 for (; lengthB > 0; lengthB >>= 1) 764 for (; lengthB > 0; lengthB >>= 1)
762 { 765 {
763 /* same as gf2_matrix_square(a, b); */ 766 /* same as gf2_matrix_square(a, b); */
764 for (int i = 0; i < CrcBits; i++) 767 for (i = 0; i < CrcBits; i++)
765 { 768 {
769 int j;
766 uint32_t vec = b[i]; 770 uint32_t vec = b[i];
767 a[i] = 0; 771 a[i] = 0;
768 for (int j = 0; vec != 0; j++, vec >>= 1) 772 for (j = 0; vec != 0; j++, vec >>= 1)
769 if (vec & 1) 773 if (vec & 1)
770 a[i] ^= b[j]; 774 a[i] ^= b[j];
771 } 775 }
772 776
773 /* apply zeros operator for this bit */ 777 /* apply zeros operator for this bit */
774 if (lengthB & 1) 778 if (lengthB & 1)
775 { 779 {
776 /* same as firstCrc32 = gf2_matrix_times(a, firstCrc32); */ 780 /* same as firstCrc32 = gf2_matrix_times(a, firstCrc32); */
777 uint32_t sum = 0; 781 uint32_t sum = 0;
778 for (int i = 0; crcA != 0; i++, crcA >>= 1) 782 for (i = 0; crcA != 0; i++, crcA >>= 1)
779 if (crcA & 1) 783 if (crcA & 1)
780 sum ^= a[i]; 784 sum ^= a[i];
781 crcA = sum; 785 crcA = sum;
782 } 786 }
783 787

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines