ورود

View Full Version : من سورس یک ادیتور متن رو میخوام



mohammadali
شنبه 24 اردیبهشت 1384, 19:39 عصر
هر کس میتونه کمک کنه
:oops: :( ::نوشتن::

مهدی
شنبه 24 اردیبهشت 1384, 23:42 عصر
من یکی با C تحت DOS نوشته بودم. به دردت میخوره یه mail بزن برات بفرستم:mahdi_h@acm.org

hassan_kahrizy
یک شنبه 25 اردیبهشت 1384, 05:35 صبح
بسمه تعالی
با سلام
اگر امکان داره در سایت بگذارید تابقیه استفاده کنند
در ضمن من یک سور ادیتور در پاسکال دارم که البته باید خودتون تبدیلش کنید
موفق باشید :flower:

rezaTavak
دوشنبه 26 اردیبهشت 1384, 21:11 عصر
سلام

http://directory.fsf.org/search/fsd-search.py?q=editor

Pars Giga
شنبه 14 خرداد 1384, 08:25 صبح
من دارم

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

مهدی
شنبه 14 خرداد 1384, 13:26 عصر
اینم از اون ادیتور که گفتم!
تا جایی که من میدونم کامله! فقط امکان copy & paste رو چون یه روز بیشتر روش کار نکردم یه کمی باگ داره. کسی حوصله داشت درستش کنه بگه تا بهش بگم چه مشکلی داره! خودم اصلا نمیرسم! :sorry:

hassan_kahrizy
یک شنبه 15 خرداد 1384, 04:13 صبح
بسمه تعالی
سلام
خیلی ممنون
:flower:

Pars Giga
یک شنبه 15 خرداد 1384, 07:40 صبح
سلام
چطور می شه حرکت ادیور را بازسزی کرد
مثلا وقتی دکمه پایین را می زنی صفحه به سمت بالا حرکت می کنه
و شما خطهای پایین را می بینی

مهدی
یک شنبه 15 خرداد 1384, 10:51 صبح
مثلا وقتی دکمه پایین را می زنی صفحه به سمت بالا حرکت می کنه

این سوال برنامه نویسی بود یا تست هوش؟ :sunglass:

Pars Giga
یک شنبه 15 خرداد 1384, 13:21 عصر
:mad:

fg_sahel
سه شنبه 30 آبان 1385, 18:24 عصر
من یک ادیتورمتن برای وب سایتم می خوام .بطوریکه مدیر وب سایت بتونه هر صفحه ی وب رو با سلیقه خودش ویرایش کنه؟ آیا کسی چنین ادیتوری داره ؟

alireza643
چهارشنبه 01 آذر 1385, 08:02 صبح
دوستان اگر دنبال ادیتور میگردید توی مثال های ویژوال سی++ یک ادیتور کامل هست که فقط باید کامپایل بشه وکار میکنه میتونید از اون استفاده کنید.همه کار هم میکنه تقریبا مثل ادیتور های ویندوز کار میکنه شاید هم بهتر.

hasina
چهارشنبه 01 آذر 1385, 09:16 صبح
چطور می شه حرکت ادیور را بازسزی کرد
مثلا وقتی دکمه پایین را می زنی صفحه به سمت بالا حرکت می کنه
و شما خطهای پایین را می بینی

خیلی راحت کافیه همه محتویات صفحه رو یک خط شیفت بدی بالا و به ازای هر خط شیفت دادن یک ردیف توی آرایه یا لیستی که داری توش می نویسی بری پایین و اطلاعاتشو روی صفحه نشون بدی.