You are on page 1of 6

*\ Experiment No.

7 :Screen Editor : *\
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#define RIGHT 77
#define LEFT 75
#define UP 72
#define DOWN 80
#define DELETE 83
#define BACKSPACE 8
#define F1 59
#define F2 60
#define F3 61
int cx=1,cy=1,cxx=0,fchar=0,tchar=79;
int nline=0;
int fline=0,tline=0;
int cline=0;
/***************************************************
cx : X-Cordinate of the cursor
cy : Y-Cordinate of the cursor
cxx : position of the cursor in the current line in the file
fchar,tchar
: Only a portion of the line is displayed on the screen. fchar gives
the left position and tchar gives the right position in the line.
nline: Number of lines in the file
fline,tline
: In this program,21 lines of the file are displayed at a time. These
lines are from fline to tline.
cline: It gives the line number of the line on which the cursor is placed
*/
static char buffer[80][121];//The file may contain maximum of 80 lines,
//each line may contain maximum of 118 characters
int lengthof(int cline) ;//Gives the length of a line
void displine(int cline);
void dispmenu()
{
int i;
gotoxy(1,22);
printf("---------------------------------------------------------------");
gotoxy(1,23);
printf("F1 - Save F3- Exit");
gotoxy(1,24);
printf("---------------------------------------------------------------");
}
int spaceline(int cline) //The current line may contain only white spaces
{
int j;
for(j=0;j<120;j++)
if(buffer[cline][j]!=' ' )
return(0);
return(1);
}
void display() //Display contents of the screen buffer
{
int i,j;
clrscr();
for(i=fline;i<=tline;i++ )
{
gotoxy(1,i+1-fline);
for(j=fchar;j<=tchar;j++)
{
putchar(buffer[i][j]);
}
}
dispmenu();
gotoxy(cx,cy);
}
char read() //Read the next character
{
char x;
x=getch();
if(x==0)//Control character
x=getch();
return(x);
}
void Delete(int cline,int pos)//Delete the current character
{
int j;
if(pos<0)
return;
for(j=pos+1;buffer[cline][j]!=0;j++)//Shift characters left by 1 place
buffer[cline][j-1]=buffer[cline][j];
buffer[cline][j-1]=' ';
}
void deleteline() //Delete the current line
{
int i=0,j;
if(nline>1)
{
for(i=cline+1;i<=tline;i++)
strcpy(buffer[i-1],buffer[i]);
nline--;
if(cline>nline)
{
tline--;
cy=cy-1;
cx=1;
cline=cline-1;
}
}
display();
}
void insertline(int cline1,char x,int pos)
{
int i=0,j,length,l;
char buff[180];
if(x==13)//Insert a new line, it breaks the line into two lines
{
for(i=nline;i>cline1;i--)//Shift lines by 1 position
strcpy(buffer[i+1],buffer[i]);
strcpy(buffer[cline1+1],buffer[cline1]+pos);//Line after Cursor position
for(i=pos;i<=119;i++)//Fill spaces in the remaining portion
buffer[cline1][i]=' ';
buffer[cline1][120]=0;//End of text marker
for(i=strlen(buffer[cline+1]);i<120;i++) //Fill spaces in the broken lin
e
buffer[cline1+1][i]=' ';
buffer[cline1+1][120]=0;
nline++; //Adjust coordinate variables
cline++;
tline++;
cy=cy+1;
cxx=0;
cx=1;
if(cy>21)//Adjustment for the last line of the screen
{
fline++;
cy--;
}
}
else
{
for(i=118;i>=pos ;i--)//Shift right and insert the current character
buffer[cline1][i+1]=buffer[cline1][i];
buffer[cline1][i+1]=x;
}
display();
gotoxy(cx,cy);//Position the cursor
}
void save(char filename[])//Save the file
{
FILE *ptr; int i,j ;
ptr=fopen(filename,"w");
if(ptr==NULL)
{
printf("\nCould not open the file");
getch();
}
for(i=0;i<nline;i++)
{
buffer[i][118]='\n';
buffer[i][119]=0;
for(j=0;j<=119 && buffer[i][j]!=0;j++)
putc(buffer[i][j],ptr);
}
fclose(ptr);
}
void main()
{
static char filename[50];
FILE *ptr;
int length,i;
char x;
buffer[0][0]=0;//Empty buffer
clrscr();
printf("\nEnter the file name : ");
gets(filename);
ptr=fopen(filename,"r");
if(ptr==NULL)
{
ptr=fopen(filename,"w");
putc(' ',ptr);
fclose(ptr);
ptr=fopen(filename,"r");
}
if(ptr!=NULL)
{
while(!feof(ptr)) //Read the file in the screen buffer
{
tline++;
i=0;
fgets(buffer[nline],120,ptr);
while(buffer[nline][i]!='\n' && buffer[nline][i]!=0)
i++;
for(;i<119;i++)
buffer[nline][i]=' ';
buffer[nline][i]=0;
nline++;
}
}
fclose(ptr);
if(tline>20)
tline=20; //Maximum of 21 lines to be displayed
display();
gotoxy(cx,cy);
x=read(); //Read the next key
fchar=0;
tchar=lengthof(0) - 1;
if(tchar<0)
tchar=0;
if(tchar>79)
tchar=79;
while(x!=F3)
{
switch(x)
{
case F1:fclose(ptr);
save(filename);
break;
case UP:
if(cline>0)
if(cy>1 )//Scroll down
{
cy--;
cline--;
gotoxy(cx,cy);
}
else
{
fline--;
tline--;
cline--;
display();
gotoxy(cx,cy);
}
break;
case DOWN:
if(cline<nline)
if(cy<21 )//Scroll Up
{
cy++;
cline++;
gotoxy(cx,cy);
}
else
{
fline++;
tline++;
cline++;
display();
gotoxy(cx,cy);
}
break;
case RIGHT:
if(cxx<lengthof(cline))
if(cx<80 )
{
cx++;
cxx++;
gotoxy(cx,cy);
}
else
{ //Scroll left
cxx++;
fchar++;tchar++;
display();
}
break;
case LEFT:
if(cxx>0)
if(cx>1)
{
cx--;
cxx--;
gotoxy(cx,cy);
}
else
{ //Scroll right
cxx--;
fchar--;tchar--;
display();
}
break;
case DELETE:
if(cxx>0 || ! spaceline(cline))
{
tchar--;
Delete(cline,cxx);//Delete the current c
haracter
display();
gotoxy(cx,cy);
}
else
deleteline(cline);//Delete the current l
ine
break;
case BACKSPACE:
if(cxx>0 )
{
tchar--;
Delete(cline,cxx-1);//Delete the previou
s character
cxx--;
if(cx>1)
cx--;
display();
gotoxy(cx,cy);
}
break;
case 13://Enter is pressed
insertline(cline,x,cxx);
break;
default:
if(isalnum(x)||ispunct(x)||isspace(x))
{
insertline(cline,x,cxx);
cx++;cxx++;
gotoxy(cx,cy);
}
break;
}
x=read();
}
}
int lengthof(int cline)
{
return(strlen(buffer[cline]));
}

You might also like