forked from KolibriOS/kolibrios
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
154
programs/cmm/vfc/32user32.h
Normal file
154
programs/cmm/vfc/32user32.h
Normal file
@ -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
|
||||
}
|
6
programs/cmm/vfc/Tupfile.lua
Normal file
6
programs/cmm/vfc/Tupfile.lua
Normal file
@ -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")
|
5
programs/cmm/vfc/build.bat
Normal file
5
programs/cmm/vfc/build.bat
Normal file
@ -0,0 +1,5 @@
|
||||
@del vfc
|
||||
@c-- vfc.c
|
||||
@move vfc.com vfc
|
||||
@del warning.txt
|
||||
@pause
|
181
programs/cmm/vfc/if.h
Normal file
181
programs/cmm/vfc/if.h
Normal file
@ -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();
|
||||
}
|
||||
}
|
182
programs/cmm/vfc/objects.h
Normal file
182
programs/cmm/vfc/objects.h
Normal file
@ -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;
|
||||
}
|
209
programs/cmm/vfc/vfc.c
Normal file
209
programs/cmm/vfc/vfc.c
Normal file
@ -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);
|
||||
}
|
106
programs/cmm/vfc/vfc_gui.h
Normal file
106
programs/cmm/vfc/vfc_gui.h
Normal file
@ -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
Block a user