int main(int argc,char *argv[])
{
char *s,*d;
s=argv[1];
d=curfile;
if(s!=NULL) {
while(*d++ = *s++);
}
curse_x=1;
curse_y=1;
curline=0;
bottom=0;
sel_begin=-1;
sel_end=-1;
if(!loadfile(curfile)) {
buffer[0][0]='\n';
buffer[0][1]='\0';
}
edit();
face();
}
int face()
{
cls();
fk(20,6,60,12,4,7);
locate(28,8);printf("'ed' Editor for everyone.");
locate(30,10);printf("Bye,see you next time.");
color(7,0);
locate(1,25);
}
int help()
{
int i,j;
i=22;j=3;
fk(15,j,65,j+23,4,7);
locate(36,j);printf(" HELP ");
locate(i,j+2);printf("HOT KEY:");
locate(i,j+3);printf(" ALT+A Select all");
locate(i,j+4);printf(" ALT+K Select down");
locate(i,j+5);printf(" ALT+I Select up");
locate(i,j+6);printf(" ALT+C Copy block ");
locate(i,j+7);printf(" ALT+V Paste copy block ");
locate(i,j+8);printf(" ALT+< To file head");
locate(i,j+9);printf(" ALT+> To file bottom");
locate(i,j+10);printf(" ALT+S Save file ");
locate(i,j+11);printf(" ALT+Q Exit program");
locate(i,j+12);printf(" ALT+SPACE Enter COMMAND LINE ");
locate(i,j+14);printf("COMMAND LINE:");
locate(i,j+15);printf(" w OR W Save file as");
locate(i,j+16);printf(" r OR R Load file");
locate(i,j+17);printf(" q OR Q Exit program");
locate(i,j+18);printf(" ENTER Return editor");
locate(i,j+20);printf("Program by wanggf at 11-12-2, CHINA");
locate(i,j+21);printf("Release:1.0 Support: xtwgf@163.com");
color(7,0);
inkey();
}
int set_stat()
{
//return;
color(3,0);
locate(30,30);
printf("File:'%s'%c ",curfile,saveflag);
printf(" X:%d Y:%d Line:%d Bottom:%d ",
curse_x,curse_y,curline+1,bottom+1);
color(7,0);
locate(curse_x,curse_y);
}
int set_tail()
{
int l;
l=strlen(buffer[curline]);
if(curse_x>l && l>0) {
curse_x=l;
}
locate(curse_x,curse_y);
}
int cmdline()
{
int l;
int *s;
locate(1,30);
do
{
color(3,0);
printf("cmd>:");
input_string(linebuffer);
switch(linebuffer[0])
{
case 'w':
case 'W':
warning("Save filename:");
input_string(linebuffer);
if(strlen(linebuffer)<=1) break;
strcpy(curfile,linebuffer);
curfile[strlen(curfile)-1]='\0';
savefile(curfile);
break;
case 'r':
case 'R':
printf("Load filename:");
input_string(linebuffer);
if(strlen(linebuffer)<=1) break;
strcpy(curfile,linebuffer);
curfile[strlen(curfile)-1]='\0';
loadfile(curfile);
break;
case 'q':
case 'Q':
if(saveflag==42) {
warning("File NOT save!! Really EXIT?(y/n):");
input_string(linebuffer);
if(linebuffer[0]=='y' || linebuffer[0]=='Y') return 0;
}
refresh();
break;
case 'k':
case 'K':
printf("%d",keycode());
break;
case 10:
return 1;
}
}while(1);
}
int linefresh()
{
char ch=32;
int i,l;
locate(1,curse_y);
l=strlen(buffer[curline]);
for(i=1;i<=l;i++) putchar(ch);
locate(1,curse_y);
printf("%s",buffer[curline]);
locate(curse_x,curse_y);
set_stat();
}
int refresh()
{
int i,j;
cls();
locate(1,1);
j=curline+29-curse_y;
if(j>bottom) j=bottom;
for(i=curline-curse_y+1;i<=j;i++)
{
if(i<=sel_end && i>=sel_begin) {
color(4,7);
}
else {
color(7,0);
}
printf("%s",buffer[i]);
}
set_stat();
}
int tab_replace()
{
int i,j,l,p,o,q;
char *pos,ch=9;
for(i=0;i<bottom;i++) {
while((pos=strchr(buffer[i],ch))!=0) {
p=pos-buffer[i];
l=strlen(buffer[i]);
for(j=0;j<p;j++)
linebuffer[j]=buffer[i][j];
q=j;
for(o=0;o<5;o++)
linebuffer[j++]=32;
for(++q;q<l+1;q++)
linebuffer[j++]=buffer[i][q];
strcpy(buffer[i],linebuffer);
}
}
}
int loadfile(char *filename)
{
int i=0;
FILE *fd=fopen(filename,"r");
if (fd==NULL)
{
warning("Load file error..");
return 0;
}
else
{
bottom=0;
while(!feof(fd))
{
fgets(linebuffer,LINESIZE,fd);
if(!feof(fd)) {strcpy(buffer[bottom++],linebuffer);}
}
fclose(fd);
tab_replace();
}
return 1;
}
int savefile(char *filename)
{
int i=0;
FILE *fd=fopen(filename,"w");
if (fd==NULL)
{
warning("Save file error..");
return 0;
}
else
{
while(i<bottom)
{
fputs(buffer[i++],fd);
}
fclose(fd);
}
return 1;
}
int warning(char *s)
{
locate(24,30);
printf(" ");
color(1,0);
locate(1,30);
printf("%s",s);
}
int edit()
{
int ch,i,j,l,p;
refresh();
warning("ALT+H to get help");
color(7,0);
linefresh();
do
{
switch(i=keycode())
{
case 3065: //up
if(curse_y==1){
if(curline>0)
{
curline--;
refresh();
}
}
else {
curse_y--;
curline--;
set_stat();
}
set_tail();
break;
case 3066: //down
if(curse_y==29){
if(curline<bottom) {
curline++;
refresh();
}
}
else {
if (curline<bottom) {
curse_y++;
curline++;
set_stat();
}
}
set_tail();
break;
case 3068: //left
if(curse_x>1){
curse_x--;
}
set_stat();
break;
case 3067: //right
if(curse_x<80 &&
curse_x<strlen(buffer[curline])){
curse_x++;
}
set_stat();
break;
case 3053: //pgup
if(curline==0) break;
if(curline-29-curse_y>0) {
curline = curline-29;
refresh();
}
else
{ curline=0;
curse_y=1;
refresh();
}
set_tail();
break;
case 3054: //pgdown