kolibrios-gitea/programs/cmm/diff/if.h

182 lines
3.6 KiB
C
Raw Normal View History

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]='<EFBFBD>'; str[x+width-1]='<EFBFBD>';
if(s1==-1)
{
FillMemory(#str[1],width-2,'<EFBFBD>');
FillMemory(#attr[2],width-2*2,7);
}else{//<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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]='<EFBFBD>';
x2+=7;
width2-=7;
}
if(s1>0)&&(s2>0)&&(!strcmp(s1,s2))
{//<2F><><EFBFBD><><E1AEA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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,'<EFBFBD>');
FillMemory(#attr,xs1*2,0x1F);
str[0]='<EFBFBD>'; str[xs1-1]='<EFBFBD>';
printstrat(x1,y1+ys1-1,xs1,#str,#attr); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
str[0]='<EFBFBD>'; str[xs1-1]='<EFBFBD>';
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,'<EFBFBD>');
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();
}
}