sasan_vm
شنبه 14 خرداد 1384, 11:04 صبح
#include <dos.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <conio.h>
#include <alloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <bios.h>
#ifndef TRUE
#define TRUE ( 1==1 )
#define FALSE !TRUE
#endif
/*--- Global Variable -------------------------------------------*/
int MAXCOL = 80;
int TEXTMODE = 0;
int insert = 1;
int status_bar = 0;
int Line;
char attr = 0x07;
char far *disp_mem = (char far *)0xb8000000;
char filename[128] = {0};
/*--- Structurs -------------------------------------------*/
typedef struct lineaddr{
char mark;
char str[81];
struct lineaddr *next;
}LineAddr;
LineAddr *Head;
int max_line = 1;
/************************************************** ****************
* Declare: void TextColor( int color ) *
* *
* Comment: Set text color between 0 to 16 for all text mode *
* *
* *
************************************************** ****************/
void TextColor( int color )
{
extern char attr;
char cl;
cl = ( char ) ( (int ) color );
attr &= 0xf0;
attr |= ( cl & 0x0f );
}
/************************************************** ****************
* Declare: void TextBackground( int bkgrnd ) *
* *
* Comment: Set text background color between 0 to 7 for *
* All text mode *
* *
************************************************** ****************/
void TextBackground( int bkgrnd )
{
extern char attr;
char bk;
bk = ( char ) ( (int ) bkgrnd );
attr &= 0x0f;
attr |= ( bk<<4 & 0xf0 );
}
/************************************************** ****************
* Declare: void TextAttribute( char attribute ) *
* *
* Comment: Set text attribute for all text mode *
* *
* *
************************************************** ****************/
void TextAttribute( char attribute )
{
extern char attr;
attr = attribute;
}
/************************************************** ****************
* Declare: int DispChar( int xpos, int ypos, char chr ) *
* *
* Comment: This Function Use For Print a Character string *
* to display memory *
* *
************************************************** ****************/
void DispChar( int xpos, int ypos, char chr )
{
extern int MAXCOL;
extern char attr;
extern char far *disp_mem;
*(disp_mem + ( ypos * MAXCOL + xpos ) * 2 ) = chr;
*(disp_mem + ( ypos * MAXCOL + xpos ) * 2 +1 ) = attr;
}
/************************************************** ****************
* Declare: int DispStr( int xpos, int ypos, char *str ) *
* *
* Comment: This Function Use For Print a Character string *
* to display memory *
* *
************************************************** ****************/
void DispStr( int xpos, int ypos, unsigned char *str )
{
register int i=0;
while( str[i] )
DispChar( xpos+i-1, ypos, str[i++] );
}
/************************************************** ****************
* Declare: void InsertChar( char *str, int cr, int max_len ) *
* *
* Comment: This Function Use To Insert Character In String *
* *
************************************************** ****************/
void InsertChar( char *str, int cr, int max_len )
{
register int i;
for( i = max_len - 1; i > cr; i-- )
str[i] = str[ i - 1 ];
}
/************************************************** ****************
* Declare: void DeleteChar( char *str, int cr, int max_len ) *
* *
* Comment: This Function Use To Delete a Character From *
* String *
************************************************** ****************/
void DeleteChar( char *str, int cr, int max_len )
{
register int i;
for( i = cr; i < max_len; i++ )
str[i] = str[ i + 1 ];
}
/************************************************** ****************
* Declare: void StringViewE( int xm int y, int field, int ncol,*
* unsigned char *str ) *
* Comment: This Function Use To Show String On Display *
* (Call From GetsE) *
* *
************************************************** ****************/
void StringViewE( int x, int y, int field, int ncol, unsigned char *str )
{
register int i, len;
len = strlen( str );
for(i=ncol; i<len && i-ncol < field; i++)
DispChar( x+(i-ncol), y, str[i] );
for(;i-ncol <= field; i++)
DispChar( x+(i-ncol), y, 32 );
}
void StatusBar( int cr )
{
char str[80];
char tmp;
tmp = attr;
if( !status_bar ) return;
TextColor( BLACK );
TextBackground( LIGHTGRAY );
sprintf( str, " [ %3d :%5d ] Free Line : %6ld ",
cr, Line, coreleft()/sizeof( LineAddr ) );
DispStr( 0, 21, str );
TextColor( YELLOW );
TextBackground( MAGENTA );
DispStr( 0, 22,
" F1 : New F2 : Save F3 : Load F9 : Delete Line");
DispStr( 0, 23,
"Block-> F4:Mark F5:Copy F6:Move F7:Delete F8:Remark" );
TextColor( LIGHTCYAN );
TextBackground( RED );
sprintf( str, "%s", ( strlen( filename ) ) ? filename : "NONAME" );
DispStr( 40-strlen( str )/2, 0, str );
attr = tmp;
}
/************************************************** ****************
* Declare: int GetsE( int xpos, int ypos, unsigned char *str, *
* int field, int max_len ) *
* Comment: This Function Use To Gets An String From KeyBoard *
* (Delete & Insert Key Are Active) *
* *
************************************************** ****************/
int GetsE( int xpos, int ypos, unsigned char *str, int field, int max_len )
{
char c;
char attrib;
char bak[288];
int ncol = 0;
int count;
static int cr=-1;
int t1;
extern int insert;
int wrd;
int EXIT = FALSE;
union k{
int i;
char ch[2];
}key;
strcpy( bak, str );
count = strlen(str);
if( cr == -1 || cr > count ) cr = count;
if( cr >= field )
{
ncol = cr - field;
cr -= ncol;
}
do{
str[count] = '\0';
if( cr >= field )
{
cr--;
ncol++;
if( ( ncol + cr ) > max_len && ncol > 0) ncol--;
}
StringViewE( xpos, ypos, field, ncol, str );
StatusBar( cr );
gotoxy( xpos+cr+1, ypos+1);
key.i = bioskey(0);
if( !key.ch[0] )
{
switch( key.ch[1] )
{
case 77: /* Right Arrow Key */
t1 = cr+ncol;
if( cr+ncol < count ) cr++;
if( str[cr+ncol] == 142 || str[cr+ncol] == 143 )
cr++;
if( cr >= field )
{
t1 = cr-field+1;
cr -= t1;
ncol+=t1;
}
break;
case 75: /* Left Arrow Key */
t1 = cr+ncol;
if( cr+ncol > 0 ) cr--;
if( str[cr+ncol] == 142 || str[cr+ncol] == 143 )
cr--;
if( cr < 0)
{
t1 = -cr;
cr += t1;
ncol-= t1;
}
break;
case 82: /* Insert Key */
insert = (insert) ? 0 : 1;
break;
case 83: /* Delete Key */
if( count > cr+ncol )
{
DeleteChar( str, cr+ncol, max_len );
count--;
}
break;
case 71: /* Home key */
cr = 0;
ncol=0;
break;
case 79: /* End Key */
cr = count;
if( cr > field )
{
ncol = cr - field;
cr -= ncol;
}
break;
default:
return (int)key.ch[1];
}
}
else
{
switch( key.ch[0] )
{
case 8:
if( cr+ncol > 0 )
{
cr--;
if( cr < 0 )
{
cr = 0;
ncol--;
}
if( count > cr+ncol )
{
DeleteChar( str, cr+ncol, max_len );
count--;
if( cr+ncol > count ) cr--;
if( cr < 0 )
{
cr = 0;
ncol--;
}
}
}
break;
case 9:
case 13: /* Press Enter Key */
EXIT = TRUE;
cr = 0;
break;
case 27: /* Press Esc key */
//strcpy( str, bak );
return 27;
default: /* Otherwise */
if( cr+ncol == max_len-1 )
{
EXIT = TRUE;
cr = 0;
break;
}
if( insert )
{
InsertChar( str, cr+ncol, max_len );
count++;
}
str[cr+ncol] = key.ch[0];
cr++;
if( count < cr+ncol ) count=cr+ncol;
break;
}
}
}while( EXIT == FALSE );
str[count] = '\0';
return 13;
}
/************************************************** ****************
* Declare: LineAddr *LastLink( void ) *
* *
* Comment: This Function Append Record To End Of Link List *
* And Return It's Address *
* *
************************************************** ****************/
LineAddr *LastLink( void )
{
LineAddr *ptr, *tmp;
ptr = Head;
while( ptr->next ) ptr = ptr->next;
tmp = ( LineAddr *) malloc( sizeof( LineAddr ) );
tmp->next = NULL;
tmp->str[0] = 0;
tmp->mark = 0;
ptr->next = tmp;
max_line++;
return ( LineAddr * ) tmp;
}
/************************************************** ****************
* Declare: LineAddr LinkAddr( LineAddr *head, int cr ) *
* *
* Comment: This Function Return Address Of Record Of Link List*
* That cr Refer To It *
* *
************************************************** ****************/
LineAddr *LinkAddr( LineAddr *head, int cr )
{
LineAddr *tmp;
int i;
for( i=0, tmp = head; tmp->next && i < cr; i++ ) tmp = tmp->next;
return tmp;
}
/************************************************** ****************
* Declare: void LastFree( void ) *
* *
* Comment: Free Last Record Of Link List *
* *
************************************************** ****************/
void LastFree( void )
{
LineAddr *ptr, *tmp;
ptr = Head;
if( !ptr->next ) return;
while( ptr->next ) { tmp = ptr; ptr = ptr->next; }
free( (LineAddr *) ptr );
tmp->next = NULL ;
max_line--;
}
/************************************************** ****************
* Declare: void LinkFree( void ) *
* *
* Comment: Free All Of Record To Make New Link List *
* *
************************************************** ****************/
void LinkFree( void )
{
while( Head->next ) LastFree();
Head->mark = 0;
Head->str[0] = 0;
}
/************************************************** ****************
* Declare: void DeleteLine( int cr ) *
* *
* Comment: Delete Record From Link List That cr Refers To It *
* *
************************************************** ****************/
void DeleteLine( int cr )
{
LineAddr *ptr, *tmp;
ptr = LinkAddr( Head, cr );
if( cr > 0 )
{
tmp = ptr->next;
ptr = LinkAddr( Head, cr-1 );
free( (LineAddr * ) ptr->next );
ptr->next = tmp;
max_line--;
}
else if( ptr->next )
{
Head = ptr->next;
free( (LineAddr * ) ptr );
max_line--;
}
else
{
Head->str[0] = 0;
Head->mark = 0;
}
}
/************************************************** ****************
* Declare: int InsertLine( int cr ) *
* *
* Comment: Insert Record To Link List , cr Refer To Position *
* *
************************************************** ****************/
int InsertLine( int cr )
{
LineAddr *tmp, *tmp2;
tmp = LinkAddr( Head, cr );
tmp2 = ( LineAddr * ) malloc( sizeof( LineAddr ) );
if( !tmp2 ) return -1;
tmp2->next = tmp->next;
tmp2->str[0] = 0;
tmp2->mark = 0;
tmp->next = tmp2;
max_line++;
return 0;
}
/************************************************** ****************
* Declare: void Refresh( void ) *
* *
* Comment: Refresh Display *
* *
************************************************** ****************/
void Refresh( void )
{
int i, j;
TextColor( BLUE );
TextBackground( BLACK );
for(j=0; j<25; j++ )
for( i=0; i<80; i++ )
DispChar( i, j, 176 );
TextBackground( LIGHTGRAY );
for( i=0; i<80; i++ )
DispChar( i, 21, 32 );
TextBackground( MAGENTA );
for(j=22; j<=23; j++ )
for( i=0; i<80; i++ )
DispChar( i, j, 32 );
}
/************************************************** ****************
* Declare: void Save( void ) *
* *
* Comment: Save Link List To Text File *
* *
************************************************** ****************/
void Save( void )
{
LineAddr *ptr;
char cr[] = {'\n', '\r'};
int fd, i;
TextColor( WHITE );
TextBackground( BLUE );
DispStr(1, 24, "Enter File Name: " );
i = GetsE( 17, 24, filename, 30, 127 );
strupr( filename );
if( i == 13 )
{
if((fd=open( filename, O_BINARY | O_WRONLY | O_CREAT | O_TRUNC,
S_IREAD | S_IWRITE))<0)
{
DispStr( 1, 24, " Unable To Creat>" );
filename[0] = 0;
return;
}
ptr = Head;
while( ptr )
{
write( fd, ptr->str, strlen( ptr->str ) );
write( fd, cr, 2 );
ptr = ptr->next;
}
close( fd );
}
Refresh();
}
/************************************************** ****************
* Declare: int Txt_line_read( int fd, char *str ) *
* *
* Comment: Read one Line From Text File *
* *
************************************************** ****************/
int Txt_line_read( int fd, char *str )
{
unsigned char c;
int i=0, j;
do{
if( read( fd, &c, 1 ) == -1 )
{
clrscr();
printf( "Reading Error\n");
exit(0);
}
if( c == 26 ) return -2;
}while(( c == '\r' || c == '\n' ) && !eof(fd) );
str[i] = c;
do{
if( str[i] == 9 )
for(j=0; i<78 && j<8; i++, j++ )
str[i] = 32;
else i++;
if( read( fd, &c, 1 ) == -1 )
{
clrscr();
printf( "Reading Error\n");
exit(0);
}
str[i] = c;
}while( c != '\r' && c != '\n' && c != 26 && !eof( fd ) && i<78 );
str[i] = 0;
return ( c == 26 || eof(fd) ) ? -2 : 0;
}
/************************************************** ****************
* Declare: void Load( void ) *
* *
* Comment: Load Text File And Make Link List *
* *
************************************************** ****************/
void Load( void )
{
LineAddr *ptr;
char status[80];
int fd, i;
TextColor( WHITE );
TextBackground( BLUE );
DispStr(1, 24, "Enter File Name: " );
i = GetsE( 17, 24, filename, 30, 127 );
strupr( filename );
if( i == 13 )
{
if((fd=open( filename, O_BINARY | O_RDONLY ))<0)
{
DispStr( 1, 24, " Unable To Open>" );
filename[0] = 0;
return;
}
Refresh();
TextColor( LIGHTRED );
TextBackground( CYAN );
LinkFree();
ptr = Head;
i=0;
while( !i )
{
i = Txt_line_read( fd, ptr->str );
ptr = LastLink( );
sprintf( status, " Load Line %d ", max_line );
DispStr( 0, 24, status );
}
close( fd );
}
Refresh();
}
/************************************************** ****************
* Declare: int DispView( int start ) *
* *
* Comment: View Part Of Link List To Monitor From start to *
* start + 20 *
* *
************************************************** ****************/
void DispView( int start )
{
LineAddr *ptr;
char str[81], buf[81];
int i;
TextColor( WHITE );
TextBackground( BLUE );
for(i=0; i<20 && i+start<max_line; i++ )
{
ptr = LinkAddr( Head, i+start );
sprintf( str, "%-80s",ptr->str );
if( ptr->mark )
TextBackground( MAGENTA );
else
TextBackground( BLUE );
DispStr( 0, 1+i, str );
}
TextBackground( BLUE );
for(; i<20; i++ )
{
sprintf( str, "%-80s"," " );
DispStr( 0, 1+i, str );
}
}
/************************************************** ****************
* Declare: void MarkCopy( int cr ) *
* *
* Comment: Copy Lines That You Mark them To Position That *
* cr Refer To It *
* *
************************************************** ****************/
void MarkCopy( int cr )
{
LineAddr *ptr, *ptr2;
ptr = Head;
while( ptr->next )
{
if( ptr->mark )
{
InsertLine( cr++ );
ptr2 = LinkAddr( Head, cr );
strcpy( ptr2->str, ptr->str );
}
ptr = ptr->next;
}
}
/************************************************** ****************
* Declare: void RemoveAllMarks( void ) *
* *
* Comment: Remove All Of Marke from List *
* *
************************************************** ****************/
void RemoveAllMarks( void )
{
LineAddr *ptr;
ptr = Head;
while( ptr->next )
{
ptr->mark = 0;
ptr = ptr->next;
}
}
/************************************************** ****************
* Declare: void MarkDelete( void ) *
* *
* Comment: Delete All Lines that you marked them from list *
* *
************************************************** ****************/
void MarkDelete( void )
{
int i;
LineAddr *ptr;
for(i=0; i<max_line; i++ )
{
ptr = LinkAddr( Head, i );
if( ptr->mark )
{
DeleteLine( i );
i--;
}
}
}
/************************************************** ****************
* Declare: void Edit( void ) *
* *
* Comment: Main Function To Edit A Text File *
* *
************************************************** ****************/
void Edit( void )
{
int y_cr=0, f_cr=0;
int retv, Exit = 0;
LineAddr *ptr;
char str[80];
Head = ( LineAddr * ) malloc( sizeof( LineAddr ) );
Head->next = NULL;
Head->mark = 0;
Head->str[0] = 0;
do{
while( y_cr + f_cr > max_line-1 )
if( y_cr > 0 ) y_cr--;
else if( f_cr > 0 ) f_cr--;
DispView( f_cr );
ptr = LinkAddr( Head, y_cr + f_cr );
if( ptr->mark )
TextBackground( MAGENTA );
else
TextBackground( BLUE );
status_bar = 1;
Line = y_cr + f_cr+1;
retv = GetsE( 0, y_cr+1, ptr->str, 78, 77 );
status_bar = 0;
switch( retv )
{
case 72:
if( y_cr > 0 ) y_cr--;
else if( f_cr > 0 ) f_cr--;
break;
case 80:
if( y_cr < 19 && y_cr+f_cr < max_line-1 ) y_cr++;
else if( y_cr+f_cr < max_line-1 ) f_cr++;
break;
case 13:
if( !InsertLine(y_cr+f_cr) )
{
if( y_cr < 19 && y_cr+f_cr < max_line-1 ) y_cr++;
else if( y_cr+f_cr < max_line-1 ) f_cr++;
else putch(7);
}
break;
case 59: /* New */
LinkFree();
filename[0] = 0;
break;
case 60: /* F2 : Save */
Save();
break;
case 61: /* F3 : Load */
Load();
y_cr = f_cr = 0;
break;
case 62: /* F4: Mark / Remove Mark */
ptr->mark = ( ptr->mark ) ? 0 : 1;
break;
case 63: /* F5: Copy Marked Lines */
MarkCopy( y_cr+f_cr );
break;
case 64: /* F6: Move Marked Lines */
MarkCopy( y_cr+f_cr );
MarkDelete( );
break;
case 65: /* F7: Delete Marked Lines */
MarkDelete( );
break;
case 66: /* F8 : Remove Markes */
RemoveAllMarks();
break;
case 67: /* F9: Delete Line */
if( y_cr+f_cr < max_line-1 )
DeleteLine( y_cr+f_cr);
break;
case 27:
Exit = 1;
break;
}
}while( Exit == 0 );
}
void main( void )
{
Refresh();
Edit();
clrscr();
}
hasina
چهارشنبه 01 آذر 1385, 09:16 صبح
چطور می شه حرکت ادیور را بازسزی کرد
مثلا وقتی دکمه پایین را می زنی صفحه به سمت بالا حرکت می کنه
و شما خطهای پایین را می بینی
خیلی راحت کافیه همه محتویات صفحه رو یک خط شیفت بدی بالا و به ازای هر خط شیفت دادن یک ردیف توی آرایه یا لیستی که داری توش می نویسی بری پایین و اطلاعاتشو روی صفحه نشون بدی.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.