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(); } }