cmm: upload vfc (Visual Text Comparer / Diff tool)
git-svn-id: svn://kolibrios.org@6732 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
672c7ac0a1
commit
6b3f26b172
|
@ -0,0 +1,154 @@
|
||||||
|
|
||||||
|
|
||||||
|
:static int __wsprintfproc;
|
||||||
|
:static int cdecl __wsprintf(int buff,mask,...){
|
||||||
|
char buffer[MAX_PATH];
|
||||||
|
char bufnum[32];
|
||||||
|
int bufferlen;
|
||||||
|
int param;
|
||||||
|
int length;
|
||||||
|
int pad;
|
||||||
|
|
||||||
|
struct _wsprintf_mf{
|
||||||
|
int precision;
|
||||||
|
int width;
|
||||||
|
int minus ;
|
||||||
|
int plus ;
|
||||||
|
int diez ;
|
||||||
|
int zero ;
|
||||||
|
byte upcase ;
|
||||||
|
byte _signed;//
|
||||||
|
}mf;
|
||||||
|
|
||||||
|
$push EBX,ESI,EDI;
|
||||||
|
param=#mask[sizeof(mask)];
|
||||||
|
length=0;
|
||||||
|
EDX=mask;
|
||||||
|
EBX=buff;
|
||||||
|
for(;;){
|
||||||
|
mf=0;
|
||||||
|
mf.precision=0x7FFF;
|
||||||
|
REPEATSMALL:
|
||||||
|
if(!DSCHAR[EDX]){
|
||||||
|
AL=0;
|
||||||
|
$call __wsprintfproc;
|
||||||
|
$pop EDI,ESI,EBX;
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
if(DSCHAR[EDX]!='%'){
|
||||||
|
WRITECHAR: AL=DSCHAR[EDX];$call __wsprintfproc; EDX++;GOTO REPEATSMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GETMASK:
|
||||||
|
EDX++;
|
||||||
|
SWITCH(DSCHAR[EDX]){
|
||||||
|
CASE '-': mf.minus++;goto GETMASK;
|
||||||
|
CASE '+': mf.plus ++;goto GETMASK;
|
||||||
|
CASE '#': mf.diez ++;goto GETMASK;
|
||||||
|
CASE '0': mf.zero ++;EDX++;
|
||||||
|
}
|
||||||
|
|
||||||
|
WHILE(DSCHAR[EDX]>='0')&&(DSCHAR[EDX]<='9'){
|
||||||
|
$push EDX;mf.width=mf.width*10+DSCHAR[EDX]-'0';$pop EDX;EDX++;
|
||||||
|
}
|
||||||
|
if(DSCHAR[EDX]=='.'){
|
||||||
|
mf.precision=0;
|
||||||
|
GETPRECISION:
|
||||||
|
EDX++;
|
||||||
|
if(DSCHAR[EDX]>='0')
|
||||||
|
&&(DSCHAR[EDX]<='9'){
|
||||||
|
$push EDX;mf.precision=mf.precision*10+DSCHAR[EDX]-'0';$pop EDX;
|
||||||
|
GOTO GETPRECISION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(DSCHAR[EDX]=='l'){
|
||||||
|
EDX++;
|
||||||
|
}
|
||||||
|
if(DSCHAR[EDX]=='h'){
|
||||||
|
EDX++;
|
||||||
|
}
|
||||||
|
if(DSCHAR[EDX]<'a'){mf.upcase=1;}
|
||||||
|
SWITCH(DSCHAR[EDX]|0x20){
|
||||||
|
CASE 'c': buffer=DSCHAR[param];bufferlen=1;goto FORMAT;
|
||||||
|
CASE 's': if(!DSDWORD[param])DSDWORD[param]="(null)";//??????
|
||||||
|
FOR(bufferlen=0;bufferlen<mf.precision;bufferlen++){
|
||||||
|
AL=DSCHAR[DSDWORD[param]+bufferlen];
|
||||||
|
if(!AL)BREAK;
|
||||||
|
buffer[bufferlen]=AL;
|
||||||
|
}
|
||||||
|
goto FORMAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//á ᨬ¢®«ì묨 ¯®ª®ç¨«¨. ⥯¥àì ç¨á«®¢ë¥
|
||||||
|
if(mf.precision==0x7FFF){mf.precision=mf.width;}
|
||||||
|
if(!mf.precision)mf.precision=1;
|
||||||
|
if(DSCHAR[EDX]|0x20=='x'){
|
||||||
|
$push EDX;
|
||||||
|
EDI=0;//cnt
|
||||||
|
EDX=DSDWORD[param];
|
||||||
|
WHILE(EDX){
|
||||||
|
AL=DL&0xF+0x30;if(AL>'9'){AL+='A'-'9'-1;if(!mf.upcase)AL|=0x20;}
|
||||||
|
bufnum[EDI]=AL;EDI++;EDX>>=4;
|
||||||
|
}
|
||||||
|
$pop EDX;
|
||||||
|
WHILE(EDI<mf.precision){bufnum[EDI]='0';EDI++;}
|
||||||
|
if(mf.diez){bufnum[EDI]=DSCHAR[EDX];EDI++;bufnum[EDI]='0';EDI++;}
|
||||||
|
FOR(bufferlen=0;EDI;bufferlen++){
|
||||||
|
EDI--;buffer[bufferlen]=bufnum[EDI];
|
||||||
|
}
|
||||||
|
goto FORMAT;
|
||||||
|
}
|
||||||
|
switch(DSCHAR[EDX]){
|
||||||
|
CASE 'i':
|
||||||
|
CASE 'd': $push EDX;EDX=DSDWORD[param];
|
||||||
|
if(int EDX<0){-EDX;mf._signed++;}
|
||||||
|
GOTO WRITEINT;
|
||||||
|
CASE 'u': $push EDX;mf.plus=0;EDX=DSDWORD[param];
|
||||||
|
WRITEINT:
|
||||||
|
EDI=0;//cnt
|
||||||
|
WHILE(EDX){
|
||||||
|
EAX=0;EDX><EAX;EAX/=10;EDX><EAX;bufnum[EDI]=AL+'0';EDI++;
|
||||||
|
}
|
||||||
|
WHILE(EDI<mf.precision){bufnum[EDI]='0';EDI++;}
|
||||||
|
if(mf._signed){bufnum[EDI]='-';EDI++;}
|
||||||
|
ELSE
|
||||||
|
if(mf.plus){bufnum[EDI]='+';EDI++;}
|
||||||
|
FOR(bufferlen=0;EDI;bufferlen++){
|
||||||
|
EDI--;buffer[bufferlen]=bufnum[EDI];
|
||||||
|
}
|
||||||
|
$pop EDX;
|
||||||
|
FORMAT:
|
||||||
|
EDX++;
|
||||||
|
param+=sizeof(int);
|
||||||
|
pad=mf.width-bufferlen;if(pad<0)pad=0;
|
||||||
|
if(!mf.minus)$call FRM;
|
||||||
|
FOR(EDI=0;EDI<bufferlen;EDI++){AL=buffer[EDI];$call __wsprintfproc;}
|
||||||
|
if(mf.minus)$call FRM;
|
||||||
|
BREAK;
|
||||||
|
default:
|
||||||
|
goto WRITECHAR;
|
||||||
|
}
|
||||||
|
}//for(;;)
|
||||||
|
FRM: WHILE(pad){AL=' ';$call __wsprintfproc;pad--;}$ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
:int cdecl wsprintf(...)inline{
|
||||||
|
__wsprintfproc=#WSP;
|
||||||
|
goto __wsprintf;
|
||||||
|
WSP: DSCHAR[EBX]=AL;EBX++;$ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
:void FillMemory(int dest,len,byt){
|
||||||
|
EDI = dest;
|
||||||
|
ECX = len;
|
||||||
|
AL = byt;
|
||||||
|
$cld $rep $stosb
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define CopyMemory memmov
|
||||||
|
:void CopyMemory(int dest,src,len){
|
||||||
|
EDI = dest;
|
||||||
|
ESI = src;
|
||||||
|
ECX = len;
|
||||||
|
$cld $rep $movsb
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
if tup.getconfig("NO_CMM") ~= "" then return end
|
||||||
|
if tup.getconfig("LANG") == "ru"
|
||||||
|
then C_LANG = "LANG_RUS"
|
||||||
|
else C_LANG = "LANG_ENG" -- this includes default case without config
|
||||||
|
end
|
||||||
|
tup.rule("vfc.c", "c-- /D=AUTOBUILD /D=$(C_LANG) %f" .. tup.getconfig("KPACK_CMD"), "vfc.com")
|
|
@ -0,0 +1,5 @@
|
||||||
|
@del vfc
|
||||||
|
@c-- vfc.c
|
||||||
|
@move vfc.com vfc
|
||||||
|
@del warning.txt
|
||||||
|
@pause
|
|
@ -0,0 +1,181 @@
|
||||||
|
int verthoriz=0;
|
||||||
|
int shownums=1;
|
||||||
|
|
||||||
|
char str[MAX_PATH];
|
||||||
|
word attr[MAX_PATH];
|
||||||
|
|
||||||
|
printstrat(int x,y,size,_text,_attr)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0; i<size; i++)
|
||||||
|
{
|
||||||
|
con_set_flags stdcall (ESBYTE[i*2+_attr]);
|
||||||
|
con_set_cursor_pos stdcall (x+i,y);
|
||||||
|
con_write_string stdcall (_text+i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
drawline(int x,y,width,linex,s1,s2,ln)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int s1l;
|
||||||
|
int s2l;
|
||||||
|
int c1,c2;
|
||||||
|
char temp[10];
|
||||||
|
int x2,width2;
|
||||||
|
|
||||||
|
|
||||||
|
s1l=-1;
|
||||||
|
s2l=-1;
|
||||||
|
if(s1!=-1)s1l=strlen(s1);
|
||||||
|
if(s2!=-1)s2l=strlen(s2);
|
||||||
|
|
||||||
|
FillMemory(#attr,width*2,0x1F);
|
||||||
|
str[0]='º'; str[x+width-1]='º';
|
||||||
|
|
||||||
|
if(s1==-1)
|
||||||
|
{
|
||||||
|
FillMemory(#str[1],width-2,'ú');
|
||||||
|
FillMemory(#attr[2],width-2*2,7);
|
||||||
|
}else{//áâப ¯à¨áãâáâ¢ã¥â
|
||||||
|
x2=1;
|
||||||
|
width2=width;
|
||||||
|
if(shownums)
|
||||||
|
{
|
||||||
|
wsprintf(#temp,"%6d",ln+1);
|
||||||
|
for(i=0;i<6;i++)
|
||||||
|
{
|
||||||
|
str[i+1]=temp[i];
|
||||||
|
attr[i+1]=0x19;
|
||||||
|
}
|
||||||
|
str[7]='³';
|
||||||
|
x2+=7;
|
||||||
|
width2-=7;
|
||||||
|
}
|
||||||
|
if(s1>0)&&(s2>0)&&(!strcmp(s1,s2))
|
||||||
|
{//áâப¨ ᮢ¯ ¤ îâ
|
||||||
|
for(i=0;i<width2-2;i++)
|
||||||
|
if(i+linex<s1l)str[x2+i]=DSBYTE[s1+i+linex];else str[x2+i]=' ';
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
for(i=0;i<width2-2;i++)
|
||||||
|
{
|
||||||
|
if(i+linex<s1l)c1=DSBYTE[s1+i+linex]; else c1=' ';
|
||||||
|
if(i+linex<s2l)c2=DSBYTE[s2+i+linex]; else c2=' ';
|
||||||
|
str[x2+i]=c1;
|
||||||
|
if(c1==c2)attr[x2+i]=0x4F;else attr[x2+i]=0x4E;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printstrat(x,y,width,#str,#attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawborder(dword x1,y1,xs1,ys1,fname,line)
|
||||||
|
char temp[MAX_PATH];
|
||||||
|
int titlelen;
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
FillMemory(#str,xs1,'Í');
|
||||||
|
FillMemory(#attr,xs1*2,0x1F);
|
||||||
|
|
||||||
|
str[0]='È'; str[xs1-1]='¼';
|
||||||
|
printstrat(x1,y1+ys1-1,xs1,#str,#attr); //¨¦ïï áâà®çª
|
||||||
|
|
||||||
|
str[0]='É'; str[xs1-1]='»';
|
||||||
|
titlelen=xs1-4;
|
||||||
|
if(!shownums)titlelen-=8;
|
||||||
|
if(strlen(fname)>titlelen)wsprintf(#temp," ...%s ",strlen(fname)+fname-titlelen+3);
|
||||||
|
else wsprintf(#temp," %s ",fname);
|
||||||
|
for(i=0;temp[i];i++){ str[i+1]=temp[i]; attr[i+1]=0x1E; }
|
||||||
|
if(!shownums)
|
||||||
|
{
|
||||||
|
wsprintf(#temp,"[%6d]",line);
|
||||||
|
CopyMemory(xs1-9+#str,#temp,8);
|
||||||
|
FillMemory(xs1-8*2+#attr,12,0x19);
|
||||||
|
}
|
||||||
|
printstrat(x1,y1,xs1,#str,#attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
printpanel(dword line,linex ,x1,y1,xs1,ys1 ,x2,y2,xs2,ys2)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
int s,d,sl,dl;
|
||||||
|
int line1,line2;
|
||||||
|
|
||||||
|
for(j=line;j<srcfilenums.Count;j++){ s=srcfilenums.At(j); if(s!=-1)BREAK; }
|
||||||
|
if(s==-1)s=srcfilelines.Count-1;
|
||||||
|
drawborder(x1,y1,xs1,ys1,srcfilename,s+1);
|
||||||
|
|
||||||
|
for(j=line;j<dstfilenums.Count;j++){ d=dstfilenums.At(j); if(d!=-1)BREAK; }
|
||||||
|
if(d==-1)d=dstfilelines.Count-1;
|
||||||
|
drawborder(x2,y2,xs2,ys2,dstfilename,d+1);
|
||||||
|
for(j=0;j<ys1-2;j++)
|
||||||
|
{
|
||||||
|
if(j+line<srcfilenums.Count)s=srcfilenums.At(j+line); else s=-1;
|
||||||
|
line1=s;
|
||||||
|
if(s!=-1)s=srcfilelines.At(s);
|
||||||
|
if(j+line<dstfilenums.Count)d=dstfilenums.At(j+line); else d=-1;
|
||||||
|
line2=d;
|
||||||
|
if(d!=-1)d=dstfilelines.At(d);
|
||||||
|
drawline(x1,y1+j+1,xs1,linex,s,d,line1);
|
||||||
|
drawline(x2,y2+j+1,xs2,linex,d,s,line2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ifinit()
|
||||||
|
int linenum=0;
|
||||||
|
int linex=0;
|
||||||
|
int ys;
|
||||||
|
int sbi_x, sbi_y;
|
||||||
|
{
|
||||||
|
load_dll(libConsole, #con_init, 0);
|
||||||
|
con_init stdcall (122, 40, 122, 800, #window_title);
|
||||||
|
|
||||||
|
linenum=diffs.At(0);
|
||||||
|
|
||||||
|
sbi_x = 122;
|
||||||
|
sbi_y = 800;
|
||||||
|
|
||||||
|
sbi_y--;
|
||||||
|
ys=sbi_y-2;
|
||||||
|
|
||||||
|
if(linenum+ys>srcfilenums.Count)linenum=srcfilenums.Count-ys;
|
||||||
|
if(linenum<0) linenum=0;
|
||||||
|
|
||||||
|
@redraw:
|
||||||
|
if(!verthoriz)
|
||||||
|
{
|
||||||
|
printpanel(linenum,linex
|
||||||
|
,0,0
|
||||||
|
,sbi_x/2 ,sbi_y
|
||||||
|
,sbi_x/2 ,0
|
||||||
|
,sbi_x/2 ,sbi_y
|
||||||
|
);
|
||||||
|
ys=sbi_y-2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printpanel(linenum,linex
|
||||||
|
,0,0
|
||||||
|
,sbi_x ,sbi_y/2
|
||||||
|
,0 ,sbi_y/2
|
||||||
|
,sbi_x ,sbi_y/2
|
||||||
|
);
|
||||||
|
if(sbi_y&1)
|
||||||
|
{
|
||||||
|
FillMemory(#str,sbi_x,'°');
|
||||||
|
FillMemory(#attr,sbi_x*2,0);
|
||||||
|
printstrat(0,sbi_y-1,sbi_x,#str,#attr);
|
||||||
|
}
|
||||||
|
ys=sbi_y/2-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ys) goto redraw;
|
||||||
|
else {
|
||||||
|
con_set_cursor_pos stdcall (2,0);
|
||||||
|
ExitProcess();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,182 @@
|
||||||
|
|
||||||
|
|
||||||
|
struct TCollection{
|
||||||
|
int Count;//itemcunt
|
||||||
|
int Delta;//increase buffer Delta
|
||||||
|
int Items;//pointer to array of item pointers
|
||||||
|
int Limit;//currently allocated size (in elements) of Items list
|
||||||
|
|
||||||
|
TCollection( int ALimit,ADelta );
|
||||||
|
~TCollection( void );
|
||||||
|
|
||||||
|
int At( int Index );
|
||||||
|
void AtDelete( int Index );
|
||||||
|
void AtFree( int Index );
|
||||||
|
void AtInsert( int Index, Item );
|
||||||
|
void DeleteAll( void );
|
||||||
|
void Free( int Item );
|
||||||
|
void FreeAll( void );
|
||||||
|
void FreeItem( int Item );
|
||||||
|
void Insert( int Item );
|
||||||
|
void SetLimit( int ALimit );
|
||||||
|
};
|
||||||
|
|
||||||
|
:int TCollection::At( int Index )
|
||||||
|
{
|
||||||
|
return DSDWORD[ Index*sizeof(int)+Items ];
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::AtDelete( int Index )
|
||||||
|
{
|
||||||
|
// if(Index<0)||(Index>=Count){/*Error(coIndexError);*/return;}
|
||||||
|
ECX = Count-Index-1;
|
||||||
|
EDI = Index*sizeof(int)+Items; ESI = EDI+4; $cld; $rep;$movsd;
|
||||||
|
Count --;
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::AtFree( int Index )
|
||||||
|
{
|
||||||
|
int Item = At( Index);
|
||||||
|
AtDelete( Index );
|
||||||
|
FreeItem( Item );
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::AtInsert( int Index, Item )
|
||||||
|
{
|
||||||
|
$pushfd
|
||||||
|
IF( Count == Limit )
|
||||||
|
{
|
||||||
|
SetLimit( Count+Delta );
|
||||||
|
}
|
||||||
|
ECX = Count-Index;
|
||||||
|
EDI = Count*sizeof(int)+Items;
|
||||||
|
ESI = EDI-4; $std $rep $movsd $cld
|
||||||
|
DSDWORD[ EDI ] = Item;
|
||||||
|
Count ++;
|
||||||
|
$popfd
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::DeleteAll()
|
||||||
|
{
|
||||||
|
Count=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::Free( int Item )
|
||||||
|
{
|
||||||
|
Delete( Item );
|
||||||
|
FreeItem( Item );
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::FreeAll( void )
|
||||||
|
{
|
||||||
|
int I;
|
||||||
|
FOR( I = 0; I < Count; I ++ )FreeItem( At(I) );
|
||||||
|
Count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::FreeItem( int Item )
|
||||||
|
{
|
||||||
|
IF( Item )free( Item );//+++Dispose(PObject(Item), Done);
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::Insert( int Item )
|
||||||
|
{
|
||||||
|
AtInsert( Count, Item );
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TCollection::SetLimit( int ALimit )
|
||||||
|
{
|
||||||
|
int AItems;
|
||||||
|
|
||||||
|
IF( ALimit < Count )ALimit = Count;
|
||||||
|
IF( ALimit != Limit )
|
||||||
|
{
|
||||||
|
IF( !ALimit ) AItems = 0;
|
||||||
|
ELSE
|
||||||
|
{
|
||||||
|
AItems = malloc(ALimit*sizeof(int) );
|
||||||
|
IF( Count )&&( Items )
|
||||||
|
{
|
||||||
|
CopyMemory( AItems, Items, Limit*sizeof(int) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IF( Limit )free( Items );
|
||||||
|
Items = AItems;
|
||||||
|
Limit = ALimit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:TCollection::TCollection( int ALimit, ADelta )
|
||||||
|
{
|
||||||
|
Items = 0;
|
||||||
|
Count = 0;
|
||||||
|
Limit = 0;
|
||||||
|
Delta = ADelta;
|
||||||
|
SetLimit( ALimit );
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
:TCollection::~TCollection( void )
|
||||||
|
{
|
||||||
|
FreeAll();
|
||||||
|
SetLimit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TSortedCollection:TCollection
|
||||||
|
{
|
||||||
|
int comparemethod;
|
||||||
|
int Duplicates;
|
||||||
|
|
||||||
|
TSortedCollection( int ALimit, ADelta );
|
||||||
|
|
||||||
|
int Compare( int Key1, Key2 );
|
||||||
|
void Insert( int Item );
|
||||||
|
int Search( int Key, Index );
|
||||||
|
};
|
||||||
|
|
||||||
|
:int TSortedCollection::Compare( int Key1, Key2 )
|
||||||
|
{
|
||||||
|
strcmp( Key1, Key2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
:TSortedCollection::TSortedCollection( int ALimit, ADelta )
|
||||||
|
:TCollection( ALimit, ADelta );
|
||||||
|
{
|
||||||
|
comparemethod=#Compare;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
:void TSortedCollection::Insert( int Item )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
IF( !Search(/*KeyOf(*/Item/*)*/,#i) ) || ( Duplicates )AtInsert( i, Item );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
:int TSortedCollection::Search( int Key, Index )
|
||||||
|
{
|
||||||
|
int L, H, I, C;
|
||||||
|
int S;
|
||||||
|
|
||||||
|
S = 0;
|
||||||
|
L = 0;
|
||||||
|
H = Count-1;
|
||||||
|
WHILE( L <= H )
|
||||||
|
{
|
||||||
|
I = L+H >> 1;
|
||||||
|
ECX = I*sizeof(int)+Items;
|
||||||
|
comparemethod( this, /*KeyOf(*/DSDWORD[ECX]/*)*/, Key );
|
||||||
|
C = EAX;
|
||||||
|
IF( C < 0 ){ L = I+1; }
|
||||||
|
ELSE
|
||||||
|
{
|
||||||
|
H = I-1;
|
||||||
|
IF( !C ){
|
||||||
|
S = 1;
|
||||||
|
IF( !Duplicates )L = I;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DSDWORD[ Index ]=L;
|
||||||
|
return S;
|
||||||
|
}
|
|
@ -0,0 +1,209 @@
|
||||||
|
//visual text comparer
|
||||||
|
//by den po - jdp@bk.ru
|
||||||
|
|
||||||
|
#define MEMSIZE 4096 * 60
|
||||||
|
#include "../lib/io.h"
|
||||||
|
#include "../lib/strings.h"
|
||||||
|
#include "../lib/obj/console.h"
|
||||||
|
IO io1, io2;
|
||||||
|
|
||||||
|
#define MAX_PATH 260
|
||||||
|
|
||||||
|
#include "32user32.h"
|
||||||
|
#include "objects.h"
|
||||||
|
#include "vfc_gui.h"
|
||||||
|
|
||||||
|
#define mincmpstrings 2
|
||||||
|
#define maxcmpstrings 10
|
||||||
|
#define maxcmpoffset 100
|
||||||
|
|
||||||
|
char window_title[] = "Visual Text Comparer (Diff tool)";
|
||||||
|
|
||||||
|
char* srcfilename;
|
||||||
|
char* dstfilename;
|
||||||
|
dword srcfile;
|
||||||
|
dword dstfile;
|
||||||
|
dword srcfilesize;
|
||||||
|
dword dstfilesize;
|
||||||
|
TCollection srcfilelines; //file lines
|
||||||
|
TCollection dstfilelines;
|
||||||
|
TCollection srcfilenums; //lines numbers
|
||||||
|
TCollection dstfilenums;
|
||||||
|
|
||||||
|
struct TSimpleCollection:TSortedCollection
|
||||||
|
{
|
||||||
|
TSimpleCollection();
|
||||||
|
int Compare( int Key1, Key2 );
|
||||||
|
};
|
||||||
|
int TSimpleCollection::Compare( int Key1, Key2 ){
|
||||||
|
return Key1-Key2;
|
||||||
|
}
|
||||||
|
TSimpleCollection::TSimpleCollection():TSortedCollection(1000,1000);
|
||||||
|
{
|
||||||
|
comparemethod=#Compare;
|
||||||
|
}
|
||||||
|
|
||||||
|
TSimpleCollection diffs; //list of differing strings
|
||||||
|
dword srcfilelinks; //pointer to the previos line with the same first symbol
|
||||||
|
dword dstfilelinks; //
|
||||||
|
|
||||||
|
getstrings(dword srcfile,srcfilesize,srcfilelines){
|
||||||
|
ECX=srcfilesize;
|
||||||
|
ESI=srcfile;
|
||||||
|
WHILE(ECX){
|
||||||
|
$push ECX,ESI
|
||||||
|
EAX=srcfilelines;
|
||||||
|
EAX.TCollection.Insert(ESI);
|
||||||
|
$pop ESI,ECX
|
||||||
|
WHILE(ECX){
|
||||||
|
$cld $lodsb ECX--;
|
||||||
|
if(AL==0x0D)||(AL==0x0A)DSBYTE[ESI-1]=0;
|
||||||
|
if(AL==0x0D)&&(DSBYTE[ESI]==0x0A){$lodsb;ECX--;}
|
||||||
|
if(AL==0x0D)||(AL==0x0A)BREAK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "if.h"
|
||||||
|
|
||||||
|
bool getparam()
|
||||||
|
{
|
||||||
|
int i, param_len = strlen(#param);
|
||||||
|
if (param[0]=='"') {
|
||||||
|
for (i=1; i<param_len; i++) if (param[i]=='"') param[i]=NULL;
|
||||||
|
srcfilename = #param + 1;
|
||||||
|
dstfilename = #param + strlen(#param) + 3;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
notify("'Wrong params specified. Use next format:\nAPPPATH \"PARAM1\" \"PARAM2\"' -E");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
main(){
|
||||||
|
if (param[0]) getparam();
|
||||||
|
if (!srcfilename) || (!dstfilename) gui(); else console();
|
||||||
|
}
|
||||||
|
|
||||||
|
console() {
|
||||||
|
int i;
|
||||||
|
int p;
|
||||||
|
int bs,bd,bsc,bdc,bsp,bdp;
|
||||||
|
int cache[256];
|
||||||
|
char s1;
|
||||||
|
int s2;
|
||||||
|
|
||||||
|
srcfile = io1.read(srcfilename);
|
||||||
|
dstfile = io2.read(dstfilename);
|
||||||
|
|
||||||
|
srcfilesize = io1.FILES_SIZE;
|
||||||
|
dstfilesize = io2.FILES_SIZE;
|
||||||
|
|
||||||
|
if (!srcfile) die("'First file not found' -E");
|
||||||
|
if (!dstfile) die("'Second file not found' -E");
|
||||||
|
|
||||||
|
srcfilelines.TCollection(srcfilesize/40,8192);
|
||||||
|
dstfilelines.TCollection(dstfilesize/40,8192);
|
||||||
|
//fill line pointers
|
||||||
|
getstrings(srcfile,srcfilesize,#srcfilelines);
|
||||||
|
getstrings(dstfile,dstfilesize,#dstfilelines);
|
||||||
|
srcfilenums.TCollection(srcfilelines.Count,1000);
|
||||||
|
dstfilenums.TCollection(dstfilelines.Count,1000);
|
||||||
|
|
||||||
|
srcfilelinks=malloc(srcfilelines.Count*4);
|
||||||
|
dstfilelinks=malloc(dstfilelines.Count*4);
|
||||||
|
|
||||||
|
//fill links on the next strings with the same first symbols
|
||||||
|
FillMemory(#cache,sizeof(cache),-1); i=srcfilelines.Count;
|
||||||
|
WHILE(i){
|
||||||
|
i--;
|
||||||
|
EBX=srcfilelines.At(i); EBX=DSBYTE[EBX];
|
||||||
|
DSDWORD[i<<2+srcfilelinks]=cache[EBX*4];
|
||||||
|
cache[EBX*4]=i;
|
||||||
|
}
|
||||||
|
FillMemory(#cache,sizeof(cache),-1); i=dstfilelines.Count;
|
||||||
|
WHILE(i){
|
||||||
|
i--;
|
||||||
|
EBX=dstfilelines.At(i); EBX=DSBYTE[EBX];
|
||||||
|
DSDWORD[i<<2+dstfilelinks]=cache[EBX*4];
|
||||||
|
cache[EBX*4]=i;
|
||||||
|
}
|
||||||
|
|
||||||
|
diffs.TSimpleCollection();
|
||||||
|
|
||||||
|
while( bsp < srcfilelines.Count ) || ( bdp < dstfilelines.Count )
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
bsc=0;
|
||||||
|
p=dstfilelines.At(bdp);//current dst position
|
||||||
|
s1=DSBYTE[p];
|
||||||
|
bs=bsp+1;//found src line, bsc - number of matched
|
||||||
|
while( bs != -1 )//no next line starting with the same symbols
|
||||||
|
&&(bs-bsp<=maxcmpoffset)//check for 100 lines depth
|
||||||
|
&&(bs<srcfilelines.Count)
|
||||||
|
{
|
||||||
|
s2=srcfilelines.At(bs);
|
||||||
|
if(!strcmp(p,s2))
|
||||||
|
{//line found
|
||||||
|
bsc=1;
|
||||||
|
WHILE(bsc<maxcmpstrings)//counting number of matching lines
|
||||||
|
&&(bdp+bsc<dstfilelines.Count)
|
||||||
|
&&(bs+bsc<srcfilelines.Count)
|
||||||
|
&&(!strcmp(dstfilelines.At(bdp+bsc),srcfilelines.At(bs+bsc)))bsc++;
|
||||||
|
BREAK;
|
||||||
|
}
|
||||||
|
if(DSBYTE[s2]==s1)bs=DSDWORD[bs<<2+srcfilelinks];else bs++;
|
||||||
|
}
|
||||||
|
bdc=0;
|
||||||
|
p=srcfilelines.At(bsp);//current src position
|
||||||
|
s1=DSBYTE[p];
|
||||||
|
bd=bdp+1;//found dst line, bsc - number of matched
|
||||||
|
while( bd != -1 )//no next line starting with the same symbols
|
||||||
|
&&(bd-bdp<=maxcmpoffset)//check for 100 lines depth
|
||||||
|
&&(bd<dstfilelines.Count)
|
||||||
|
{
|
||||||
|
s2=dstfilelines.At(bd);
|
||||||
|
if(!strcmp(p,s2))
|
||||||
|
{
|
||||||
|
bdc=1;
|
||||||
|
WHILE(bdc<maxcmpstrings)//counting number of matching lines
|
||||||
|
&&(bsp+bdc<srcfilelines.Count)
|
||||||
|
&&(bd+bdc<dstfilelines.Count)
|
||||||
|
&&(!strcmp(srcfilelines.At(bsp+bdc),dstfilelines.At(bd+bdc)))bdc++;
|
||||||
|
BREAK;
|
||||||
|
}
|
||||||
|
if(DSBYTE[s2]==s1)bd=DSDWORD[bd<<2+dstfilelinks];else bd++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bsc<bdc)
|
||||||
|
if(bd-bdp<bdc)
|
||||||
|
||(bdc>=mincmpstrings)
|
||||||
|
{
|
||||||
|
WHILE(bdp<bd){
|
||||||
|
diffs.Insert(srcfilenums.Count);
|
||||||
|
srcfilenums.Insert(-1); dstfilenums.Insert(bdp); bdp++;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strcmp(srcfilelines.At(bsp),dstfilelines.At(bdp)))diffs.Insert(srcfilenums.Count);
|
||||||
|
//lines are equal
|
||||||
|
srcfilenums.Insert(bsp); bsp++;
|
||||||
|
dstfilenums.Insert(bdp); bdp++;
|
||||||
|
CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(srcfilelinks);
|
||||||
|
free(dstfilelinks);
|
||||||
|
|
||||||
|
if(!diffs.Count)
|
||||||
|
notify("'Nothing to compare' -E");
|
||||||
|
else ifinit();
|
||||||
|
|
||||||
|
diffs.DeleteAll(); delete diffs;
|
||||||
|
dstfilenums.DeleteAll(); delete dstfilenums;
|
||||||
|
srcfilenums.DeleteAll(); delete srcfilenums;
|
||||||
|
dstfilelines.DeleteAll(); delete dstfilelines;
|
||||||
|
srcfilelines.DeleteAll(); delete srcfilelines;
|
||||||
|
free(dstfile);
|
||||||
|
free(srcfile);
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
#include "../lib/gui.h"
|
||||||
|
#include "../lib/obj/box_lib.h"
|
||||||
|
#include "../lib/obj/proc_lib.h"
|
||||||
|
#include "../lib/patterns/simple_open_dialog.h"
|
||||||
|
|
||||||
|
char default_dir[] = "/rd/1";
|
||||||
|
od_filter filter2 = {0,0};
|
||||||
|
|
||||||
|
int mouse_dd1, mouse_dd2;
|
||||||
|
char src_box_text[4096];
|
||||||
|
char dst_box_text[4096];
|
||||||
|
edit_box src_box = {340,20,35,0xffffff,0x94AECE,0xFFFfff,0xffffff,0x10000000,sizeof(src_box_text),#src_box_text,#mouse_dd1, 10b};
|
||||||
|
edit_box dst_box = {340,20,95,0xffffff,0x94AECE,0xFFFfff,0xffffff,0x10000000,sizeof(dst_box_text),#dst_box_text,#mouse_dd2, 0b};
|
||||||
|
|
||||||
|
#define BID_EXIT_PRC 01
|
||||||
|
#define BID_SRC_OPEN 10
|
||||||
|
#define BID_DST_OPEN 11
|
||||||
|
#define BID_COMPARE 12
|
||||||
|
|
||||||
|
proc_info Form;
|
||||||
|
|
||||||
|
void gui()
|
||||||
|
{
|
||||||
|
word btn;
|
||||||
|
char run_param[4096];
|
||||||
|
load_dll(boxlib, #box_lib_init,0);
|
||||||
|
load_dll(Proc_lib, #OpenDialog_init,0);
|
||||||
|
OpenDialog_init stdcall (#o_dialog);
|
||||||
|
SetEventMask(0x27);
|
||||||
|
|
||||||
|
loop() switch(WaitEvent())
|
||||||
|
{
|
||||||
|
case evMouse:
|
||||||
|
edit_box_mouse stdcall (#src_box);
|
||||||
|
edit_box_mouse stdcall (#dst_box);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case evButton:
|
||||||
|
btn = GetButtonID();
|
||||||
|
switch (btn)
|
||||||
|
{
|
||||||
|
case BID_EXIT_PRC:
|
||||||
|
ExitProcess();
|
||||||
|
case BID_SRC_OPEN:
|
||||||
|
OpenDialog_start stdcall (#o_dialog);
|
||||||
|
if (o_dialog.status) {
|
||||||
|
strcpy(#src_box_text, #openfile_path);
|
||||||
|
src_box.size = src_box.pos
|
||||||
|
= src_box.shift = src_box.shift_old = strlen(#src_box_text);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BID_DST_OPEN:
|
||||||
|
OpenDialog_start stdcall (#o_dialog);
|
||||||
|
if (o_dialog.status) {
|
||||||
|
strcpy(#dst_box_text, #openfile_path);
|
||||||
|
dst_box.size = dst_box.pos
|
||||||
|
= dst_box.shift = dst_box.shift_old = strlen(#dst_box_text);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BID_COMPARE:
|
||||||
|
sprintf(#run_param, "\"%s\" \"%s\"", #src_box_text, #dst_box_text);
|
||||||
|
io.run(#program_path+1, #run_param);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case evKey:
|
||||||
|
GetKeys();
|
||||||
|
if (key_scancode == SCAN_CODE_ESC) ExitProcess();
|
||||||
|
if (key_scancode == SCAN_CODE_TAB) {
|
||||||
|
if ( src_box.flags & 10b ) {
|
||||||
|
src_box.flags -= 10b;
|
||||||
|
dst_box.flags += 10b;
|
||||||
|
} else {
|
||||||
|
src_box.flags += 10b;
|
||||||
|
dst_box.flags -= 10b;
|
||||||
|
}
|
||||||
|
edit_box_draw stdcall (#src_box);
|
||||||
|
edit_box_draw stdcall (#dst_box);
|
||||||
|
}
|
||||||
|
EAX = key_editbox;
|
||||||
|
edit_box_key stdcall (#src_box);
|
||||||
|
EAX = key_editbox;
|
||||||
|
edit_box_key stdcall (#dst_box);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case evReDraw:
|
||||||
|
draw_window();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_window()
|
||||||
|
{
|
||||||
|
system.color.get();
|
||||||
|
DefineAndDrawWindow(215, 100, 450, 195 + skin_height, 0x34, system.color.work, #window_title);
|
||||||
|
GetProcessInfo(#Form, SelfInfo);
|
||||||
|
|
||||||
|
WriteText(src_box.left-2, src_box.top-21, 0x90, system.color.work_text, "First file:");
|
||||||
|
WriteText(dst_box.left-2, dst_box.top-21, 0x90, system.color.work_text, "Second file:");
|
||||||
|
DrawEditBox(#src_box);
|
||||||
|
DrawEditBox(#dst_box);
|
||||||
|
DrawStandartCaptButton(src_box.left + src_box.width + 15, src_box.top-3, BID_SRC_OPEN, "...");
|
||||||
|
DrawStandartCaptButton(dst_box.left + dst_box.width + 15, dst_box.top-3, BID_DST_OPEN, "...");
|
||||||
|
DrawStandartCaptButton(dst_box.left - 2, dst_box.top + 40, BID_COMPARE, "Compare");
|
||||||
|
}
|
Loading…
Reference in New Issue