rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame] | 1 | use strict; |
| 2 | use warnings; |
| 3 | |
| 4 | |
| 5 | package CUIF_Structure_Check; |
| 6 | use File::Find; |
| 7 | return 1; |
| 8 | |
| 9 | |
| 10 | sub crc32 { |
| 11 | my ($input, $init_value, $polynomial) = @_; |
| 12 | |
| 13 | $init_value = 0 unless (defined $init_value); |
| 14 | $polynomial = 0xedb88320 unless (defined $polynomial); |
| 15 | |
| 16 | my @lookup_table; |
| 17 | |
| 18 | for (my $i=0; $i<256; $i++) { |
| 19 | my $x = $i; |
| 20 | for (my $j=0; $j<8; $j++) { |
| 21 | if ($x & 1) { |
| 22 | $x = ($x >> 1) ^ $polynomial; |
| 23 | } else { |
| 24 | $x = $x >> 1; |
| 25 | } |
| 26 | } |
| 27 | push @lookup_table, $x; |
| 28 | } |
| 29 | |
| 30 | my $crc = $init_value ^ 0xffffffff; |
| 31 | |
| 32 | foreach my $x (unpack ('C*', $input)) { |
| 33 | $crc = (($crc >> 8) & 0xffffff) ^ $lookup_table[ ($crc ^ $x) & 0xff ]; |
| 34 | } |
| 35 | |
| 36 | $crc = $crc ^ 0xffffffff; |
| 37 | |
| 38 | return $crc; |
| 39 | } |
| 40 | |
| 41 | |
| 42 | sub file_checksum_input{ |
| 43 | my ($filename) = @_; |
| 44 | open(FILE,$filename) or die "Could not open $filename, $!"; |
| 45 | my $str=""; |
| 46 | my @keyword=<FILE>; |
| 47 | |
| 48 | close(FILE); |
| 49 | $str=join("",@keyword); |
| 50 | |
| 51 | return $str; |
| 52 | } |
| 53 | my @all_list; |
| 54 | sub want |
| 55 | { |
| 56 | if($_ =~ /\.h$/){ |
| 57 | push @all_list, $File::Find::name; |
| 58 | } |
| 59 | } |
| 60 | sub folder_checksum_input{ |
| 61 | |
| 62 | my ($foldername) = @_; |
| 63 | find(\&want ,$foldername); |
| 64 | my $str=""; |
| 65 | my $total_str=""; |
| 66 | foreach (sort{crc32($a)<=>crc32($b)}@all_list) |
| 67 | { |
| 68 | open(FILE,$_); |
| 69 | my @keyword=<FILE>; |
| 70 | close(FILE); |
| 71 | $str=join("",@keyword); |
| 72 | $total_str = join($total_str,"",$str); |
| 73 | } |
| 74 | @all_list = (); |
| 75 | return $total_str; |
| 76 | } |
| 77 | |
| 78 | sub merge_checksum_input{ |
| 79 | my (@pathlist)=@_; |
| 80 | my $checksum_input=""; |
| 81 | my $checksum_str=""; |
| 82 | foreach (@pathlist) |
| 83 | { |
| 84 | if($_ =~ /\.h$/){ |
| 85 | $checksum_str=file_checksum_input($_); |
| 86 | $checksum_input = join($checksum_input,"",$checksum_str); |
| 87 | } |
| 88 | else{ |
| 89 | $checksum_str=folder_checksum_input($_); |
| 90 | $checksum_input=join($checksum_input,"",$checksum_str); |
| 91 | } |
| 92 | } |
| 93 | return $checksum_input; |
| 94 | } |
| 95 | |
| 96 | sub get_cuif_checksum_value{ |
| 97 | ########################################################## |
| 98 | # user : 0 =>inner |
| 99 | # 1 =>brp |
| 100 | # 2 =>fec |
| 101 | # 4 =>speech |
| 102 | ########################################################## |
| 103 | my($user,$cuif_folder_path)=@_; |
| 104 | my $CUIF_SS_FILE_PATH=join($cuif_folder_path,"","/CUIF_SS_region.h"); |
| 105 | if($user== 0 || $user==1){ |
| 106 | my $CUIF_INNER_BRP_PATH=join($cuif_folder_path,"","/inner_brp/"); |
| 107 | my @CUIF_INNER_BRP=($CUIF_SS_FILE_PATH,$CUIF_INNER_BRP_PATH); |
| 108 | my $checksum_value=sprintf("%d", &crc32(&merge_checksum_input(@CUIF_INNER_BRP))); |
| 109 | $checksum_value=join($checksum_value,"","u"); |
| 110 | return $checksum_value; |
| 111 | } |
| 112 | elsif($user==2){ |
| 113 | my $CUIF_FEC_WBRP_PATH=join($cuif_folder_path,"","/fec_wbrp/"); |
| 114 | my @CUIF_FEC_WBRP=($CUIF_SS_FILE_PATH,$CUIF_FEC_WBRP_PATH); |
| 115 | my $checksum_value=sprintf("%d", &crc32(&merge_checksum_input(@CUIF_FEC_WBRP))); |
| 116 | $checksum_value=join($checksum_value,"","u"); |
| 117 | return $checksum_value; |
| 118 | |
| 119 | } |
| 120 | elsif($user==3){ |
| 121 | my $CUIF_SPEECH_PATH=join($cuif_folder_path,"","/speech/"); |
| 122 | my @CUIF_SPEECH=($CUIF_SS_FILE_PATH,$CUIF_SPEECH_PATH); |
| 123 | my $checksum_value=sprintf("%d", &crc32(&merge_checksum_input(@CUIF_SPEECH))); |
| 124 | $checksum_value=join($checksum_value,"","u"); |
| 125 | return $checksum_value; |
| 126 | |
| 127 | } |
| 128 | else: |
| 129 | return 0; |
| 130 | } |
| 131 | |
| 132 | ############################## |
| 133 | # test code |
| 134 | ############################## |
| 135 | #my $FILENAME= ($ARGV[0]); |
| 136 | #printf "%s",get_cuif_checksum_value(0,$FILENAME); |
| 137 | #print "\n"; |
| 138 | #printf "%x",get_cuif_checksum_value(1,$FILENAME); |
| 139 | #print "\n"; |
| 140 | #printf "%x",get_cuif_checksum_value(2,$FILENAME); |
| 141 | #print "\n"; |
| 142 | #printf "%x",get_cuif_checksum_value(3,$FILENAME); |
| 143 | #print "\n"; |
| 144 | |
| 145 | |