improve similarity checking program.
This commit is contained in:
1 parent
2391e74bd2
commit
2829f5cda7
1 file changed
+41
-4
+41
-4
@@ -15,9 +15,11 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define MAX_SIZE 8192
|
#define MAX_SIZE 65536
|
||||||
int matches[MAX_SIZE];
|
int matches[MAX_SIZE];
|
||||||
|
|
||||||
|
int phase_mask[MAX_SIZE+MAX_SIZE];
|
||||||
|
|
||||||
int main(int argc,char **argv)
|
int main(int argc,char **argv)
|
||||||
{
|
{
|
||||||
if (argc!=3) {
|
if (argc!=3) {
|
||||||
@@ -26,7 +28,8 @@ int main(int argc,char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(int i=0;i<MAX_SIZE;i++) matches[i]=0;
|
for(int i=0;i<MAX_SIZE;i++) matches[i]=0;
|
||||||
|
bzero(phase_mask,sizeof(phase_mask));
|
||||||
|
|
||||||
unsigned char *f1,*f2;
|
unsigned char *f1,*f2;
|
||||||
int s1,s2;
|
int s1,s2;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@@ -62,14 +65,48 @@ int main(int argc,char **argv)
|
|||||||
for(int i=0;i<s1;i++) {
|
for(int i=0;i<s1;i++) {
|
||||||
for(int j=0;j<s2;j++) {
|
for(int j=0;j<s2;j++) {
|
||||||
int k,l;
|
int k,l;
|
||||||
|
|
||||||
|
int phase=s2+i-j;
|
||||||
|
|
||||||
|
if (phase<0) {
|
||||||
|
fprintf(stderr,"Phase < 0 : %04x %04x -> %d\n",i,j,phase);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (phase>=(MAX_SIZE+MAX_SIZE)) {
|
||||||
|
fprintf(stderr,"Phase too large : %04x %04x -> %d\n",i,j,phase);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (phase_mask[phase]) {
|
||||||
|
phase_mask[phase]--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for(k=0;((i+k)<s1)&&((j+k)<s2);k++)
|
for(k=0;((i+k)<s1)&&((j+k)<s2);k++)
|
||||||
if (f1[i+k]!=f2[j+k]) break;
|
if (f1[i+k]!=f2[j+k]) break;
|
||||||
// Ignore matches that are all the same byte
|
// Ignore matches that are all the same byte
|
||||||
for(l=1;l<k;l++) if (f1[i+l]!=f1[i]) break;
|
for(l=1;l<k;l++) if (f1[i+l]!=f1[i]) break;
|
||||||
if (l<k) {
|
if (l<k) {
|
||||||
if (k) matches[k]++;
|
// Ignore matches of no more than 3 bytes,
|
||||||
|
// since that is the max length of a 6502 instruction
|
||||||
|
if (k>2) {
|
||||||
|
matches[k]++;
|
||||||
|
}
|
||||||
|
if (k>3) {
|
||||||
|
// Display particularly long matches
|
||||||
|
printf("$%04X = $%04X :",i,j);
|
||||||
|
for(int b=0;b<k;b++) printf(" %02X",f1[i+b]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When we find a match, we should then mask off this region,
|
||||||
|
// so that we don't find all the sub-sets of the matches.
|
||||||
|
// e.g. matching BASIC at $100 will result in a match of ASIC at $101
|
||||||
|
// and SIC at $102 etc. These are all the same match, so should be
|
||||||
|
// suppressed.
|
||||||
|
phase_mask[phase]=k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user