Subversion Repositories Kolibri OS

Rev

Rev 7985 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6732 leency 1
//visual text comparer
2
//by den po - jdp@bk.ru
3
 
4
#define MEMSIZE 4096 * 60
8383 leency 5
#include "../lib/fs.h"
6732 leency 6
#include "../lib/strings.h"
7
#include "../lib/obj/console.h"
8
 
9
#define MAX_PATH 260
10
 
11
#include "32user32.h"
12
#include "objects.h"
6746 leency 13
#include "diff_gui.h"
6732 leency 14
 
15
#define mincmpstrings 2
16
#define maxcmpstrings 10
17
#define maxcmpoffset  100
18
 
6746 leency 19
char window_title[] = "Kolibri Diff tool (Visual Text Comparer)";
6732 leency 20
 
21
char* srcfilename;
22
char* dstfilename;
23
dword srcfile;
24
dword dstfile;
25
dword srcfilesize;
26
dword dstfilesize;
27
TCollection srcfilelines; //file lines
28
TCollection dstfilelines;
29
TCollection srcfilenums; //lines numbers
30
TCollection dstfilenums;
31
 
32
struct TSimpleCollection:TSortedCollection
33
{
34
  TSimpleCollection();
35
  int  Compare( int Key1, Key2 );
36
};
37
int TSimpleCollection::Compare( int Key1, Key2 ){
38
  return Key1-Key2;
39
}
40
TSimpleCollection::TSimpleCollection():TSortedCollection(1000,1000);
41
{
42
  comparemethod=#Compare;
43
}
44
 
45
TSimpleCollection diffs;   //list of differing strings
46
dword srcfilelinks;     //pointer to the previos line with the same first symbol
47
dword dstfilelinks;     //
48
 
49
getstrings(dword srcfile,srcfilesize,srcfilelines){
50
  ECX=srcfilesize;
51
  ESI=srcfile;
52
  WHILE(ECX){
53
	$push ECX,ESI
54
	EAX=srcfilelines;
55
	EAX.TCollection.Insert(ESI);
56
	$pop ESI,ECX
57
	WHILE(ECX){
58
	  $cld $lodsb ECX--;
59
	  if(AL==0x0D)||(AL==0x0A)DSBYTE[ESI-1]=0;
60
	  if(AL==0x0D)&&(DSBYTE[ESI]==0x0A){$lodsb;ECX--;}
61
	  if(AL==0x0D)||(AL==0x0A)BREAK;
62
	}
63
  }
64
}
65
 
66
#include "if.h"
67
 
68
bool getparam()
69
{
70
	int i, param_len = strlen(#param);
71
	if (param[0]=='"') {
72
		for (i=1; i
73
		srcfilename = #param + 1;
74
		dstfilename = #param + strlen(#param) + 3;
75
		return true;
76
	}
7985 leency 77
	notify("'Wrong params! Use format:\nAPPPATH \"PARAM1\" \"PARAM2\"' -E");
6732 leency 78
	return false;
79
}
80
 
81
main(){
82
	if (param[0]) getparam();
83
	if (!srcfilename) || (!dstfilename) gui(); else console();
84
}
85
 
86
console() {
87
	int i;
88
	int p;
89
	int bs,bd,bsc,bdc,bsp,bdp;
90
	int cache[256];
91
	char s1;
92
	int s2;
93
 
8383 leency 94
	read_file(srcfilename, #srcfile, #srcfilesize);
95
	read_file(dstfilename, #dstfile, #dstfilesize);
6732 leency 96
 
97
	if (!srcfile) die("'First file not found' -E");
98
	if (!dstfile) die("'Second file not found' -E");
99
 
100
	srcfilelines.TCollection(srcfilesize/40,8192);
101
	dstfilelines.TCollection(dstfilesize/40,8192);
102
	//fill line pointers
103
	getstrings(srcfile,srcfilesize,#srcfilelines);
104
	getstrings(dstfile,dstfilesize,#dstfilelines);
105
	srcfilenums.TCollection(srcfilelines.Count,1000);
106
	dstfilenums.TCollection(dstfilelines.Count,1000);
107
 
108
	srcfilelinks=malloc(srcfilelines.Count*4);
109
	dstfilelinks=malloc(dstfilelines.Count*4);
110
 
111
	//fill links on the next strings with the same first symbols
112
	FillMemory(#cache,sizeof(cache),-1); i=srcfilelines.Count;
113
	WHILE(i){
114
	  i--;
115
	  EBX=srcfilelines.At(i); EBX=DSBYTE[EBX];
116
	  DSDWORD[i<<2+srcfilelinks]=cache[EBX*4];
117
	  cache[EBX*4]=i;
118
	}
119
	FillMemory(#cache,sizeof(cache),-1); i=dstfilelines.Count;
120
	WHILE(i){
121
	  i--;
122
	  EBX=dstfilelines.At(i); EBX=DSBYTE[EBX];
123
	  DSDWORD[i<<2+dstfilelinks]=cache[EBX*4];
124
	  cache[EBX*4]=i;
125
	}
126
 
127
	diffs.TSimpleCollection();
128
 
129
	while( bsp < srcfilelines.Count ) || ( bdp < dstfilelines.Count )
130
	{
131
	  ////////////////////////////////////////////////////////
132
	  bsc=0;
133
	  p=dstfilelines.At(bdp);//current dst position
134
	  s1=DSBYTE[p];
135
	  bs=bsp+1;//foundĀ src line, bsc - number of matched
136
	  while( bs != -1 )//no next line starting with the same symbols
137
		 &&(bs-bsp<=maxcmpoffset)//check for 100 lines depth
138
		 &&(bs
139
	  {
140
		s2=srcfilelines.At(bs);
141
		if(!strcmp(p,s2))
142
		{//line found
143
		  bsc=1;
144
		  WHILE(bsc
145
			 &&(bdp+bsc
146
			 &&(bs+bsc
147
			 &&(!strcmp(dstfilelines.At(bdp+bsc),srcfilelines.At(bs+bsc)))bsc++;
148
		  BREAK;
149
		}
150
		if(DSBYTE[s2]==s1)bs=DSDWORD[bs<<2+srcfilelinks];else bs++;
151
	  }
152
	  bdc=0;
153
	  p=srcfilelines.At(bsp);//current src position
154
	  s1=DSBYTE[p];
155
	  bd=bdp+1;//foundĀ dst line, bsc - number of matched
156
	  while( bd != -1 )//no next line starting with the same symbols
157
		 &&(bd-bdp<=maxcmpoffset)//check for 100 lines depth
158
		 &&(bd
159
	  {
160
		s2=dstfilelines.At(bd);
161
		if(!strcmp(p,s2))
162
		{
163
		  bdc=1;
164
		  WHILE(bdc
165
			 &&(bsp+bdc
166
			 &&(bd+bdc
167
			 &&(!strcmp(srcfilelines.At(bsp+bdc),dstfilelines.At(bd+bdc)))bdc++;
168
		  BREAK;
169
		}
170
		if(DSBYTE[s2]==s1)bd=DSDWORD[bd<<2+dstfilelinks];else bd++;
171
	  }
172
 
173
	  if(bsc
174
	   if(bd-bdp
175
	   ||(bdc>=mincmpstrings)
176
	  {
177
		WHILE(bdp
178
		  diffs.Insert(srcfilenums.Count);
179
		  srcfilenums.Insert(-1); dstfilenums.Insert(bdp); bdp++;
180
		}
181
		continue;
182
	  }
183
 
184
	  if(strcmp(srcfilelines.At(bsp),dstfilelines.At(bdp)))diffs.Insert(srcfilenums.Count);
185
	  //lines are equal
186
	  srcfilenums.Insert(bsp); bsp++;
187
	  dstfilenums.Insert(bdp); bdp++;
188
	  CONTINUE;
189
	}
190
 
191
	free(srcfilelinks);
192
	free(dstfilelinks);
193
 
194
	if(!diffs.Count)
195
		notify("'Nothing to compare' -E");
196
	else ifinit();
197
 
198
	diffs.DeleteAll();        delete diffs;
199
	dstfilenums.DeleteAll();  delete dstfilenums;
200
	srcfilenums.DeleteAll();  delete srcfilenums;
201
	dstfilelines.DeleteAll(); delete dstfilelines;
202
	srcfilelines.DeleteAll(); delete srcfilelines;
203
	free(dstfile);
204
	free(srcfile);
205
}