#include #include #include"screen.h" #include #include #include #include #define F1 0X3B #define F2 0X3C #define F3 0X3D /* strn_o2.c 'den fark link pointerler global */ #define F4 0X3E #define F5 0X3F #define F6 0X40 #define F7 0X41 #define F8 0X42 #define F9 0X43 #define F10 0X44 #define F11 0XFF85 #define F12 0XFF86 /* Editor blo§u tuŸlar */ /* TuŸlarn ASCII kodu */ #define EDIT_BLOCK 0XFFE0 /* TuŸlarn SCAN kodu */ #define ARW_UP 0X48 #define ARW_DOWN 0X50 #define ARW_LEFT 0X4B #define ARW_RIGHT 0X4D #define HOME 0X47 #define END 0X4F #define PG_UP 0X49 #define PG_DOWN 0X51 #define DEL 0X53 #define INSERT 0X52 #define ESC 0X1B #define ENTER 0X0D #define ENTER_SCAN 0X1C /* Ekran snrlar */ #define RIGHT_MARJ 78 #define LEFT_MARJ 1 #define TOP_MARJ 2 #define BOTTOM_MARJ 22 /* char far *vp = (char far *)0xB8000000; */ struct KLV { char ascii; char scan; }; union KLV_VAR { struct KLV code; int t; }; struct LINE { char str[78]; struct LINE *next; struct LINE *prev; }; void gosterge(int row, int col, int deg1, int deg2); void scroll_down_frame(int row1, int col1, int row2, int col2, int attr); void scroll_up_frame(int row1, int col1, int row2, int col2, int attr); int key_read_spe(void); void location(int,int,int); int line_read(int *row, int *col, int *n, int size, int *count); /* Link iŸlemleri prototipleri */ struct LINE *line_create(); struct LINE *end_line_add(struct LINE *p); int is_end(struct LINE *p); int is_first(struct LINE *p); /* Definitions */ struct LINE *lptr; struct LINE *first = NULL; struct LINE *end = NULL; FILE *fd; /*yedek dosyas*/ void menu(void); main() { char str[78]; int k, count; int row, col, str_n, size; clrscr(); lptr = line_create(); first = lptr; end = lptr; size = 78; row = 2; col = 1; str_n = 0; count = 1; if((fd=fopen("ilker.dat","w"))==NULL)/*yazmaya baslamadan yedek dosyay ac*/ { printf("\ndosya olusturulamad\n"); } clrscr(); toolbar(); brush(_BLUE | WHITE); double_frame(1,0,23,79,BOLD & WHITE | _BLUE); gosterge(23, 8, count, str_n); do{ k = line_read(&row, &col, &str_n, size, &count); if (k == 0) break; toolbar(); }while(1); /* Bu d”ngden Esc ile ‡kyoruz */ /* write some data to the file */ /* close the file */ fclose(fd); /*programdan ckmadan dosyay kapa*/ return 0; } /* location(0,10,10); for(lptr = first; lptr != NULL; lptr = lptr->next ) printf("%s\n",lptr->str); }*/ toolbar(){ _writec(0,1,'S'); _writec(0,2,'a'); _writec(0,3,'v'); _writec(0,4,'e'); _writec(0,5,'('); _writec(0,6,'F'); _writec(0,7,'1'); _writec(0,8,')'); _writec(0,10,'L'); _writec(0,11,'o'); _writec(0,12,'a'); _writec(0,13,'d'); _writec(0,14,'('); _writec(0,15,'F'); _writec(0,16,'2'); _writec(0,17,')'); _writec(0,19,'E'); _writec(0,20,'x'); _writec(0,21,'i'); _writec(0,22,'t'); _writec(0,23,'('); _writec(0,24,'E'); _writec(0,25,'S'); _writec(0,26,'C'); _writec(0,27,')'); return 0; } int line_read(int *row, int *col, int *n, int size, int *count) { int ch; union KLV_VAR tus; char far *scrp = vp; char far *temp; int k,t; unsigned char far *status =(unsigned char far *)0x0417; unsigned untam = 0; struct LINE *new_line; location(0,*row,*col); tus.t = key_read_spe(); fprintf(fd,"%c",tus.code.ascii); /*dosyaya yedekle*/ if(tus.code.ascii == ESC) return 0; if (tus.code.ascii == 0){ switch(tus.code.scan){ case F12 : printf("x\n");break; case F1 : fclose(fd);sav();fd=fopen("ilker.dat","w");break; case F2 : fclose(fd);clrscr();lod(); fd=fopen("ilker.dat","w"); brush(_BLUE | WHITE); double_frame(1,0,23,79,BOLD & WHITE | _BLUE); break; default : printf("YanlŸ\n");break; } /* switch */ } /* 1.if */ else{ if (tus.code.ascii == EDIT_BLOCK ){ switch(tus.code.scan){ case ARW_UP : if(!is_first(lptr) && *row != TOP_MARJ ) { --*count;/* hangi satr */ gosterge(23, 8, *count, *n); } if(*row > TOP_MARJ && !is_first(lptr)){ --*row; lptr = lptr->prev; location(0,*row,*col); } if(*row == TOP_MARJ && !is_first(lptr)){ lptr = lptr->prev; --*count;/* hangi satr */ gosterge(23, 8, *count, *n); scroll_up_frame(TOP_MARJ, LEFT_MARJ, BOTTOM_MARJ, RIGHT_MARJ, _BLUE | WHITE); _writes(TOP_MARJ, LEFT_MARJ, lptr->str); } break; case ARW_DOWN : if(!is_end(lptr) && *row != BOTTOM_MARJ) { ++*count;/* hangi satr */ gosterge(23, 8, *count, *n); } if(*row < BOTTOM_MARJ && !is_end(lptr)){ ++*row; lptr = lptr->next; location(0,*row,*col); } if(*row == BOTTOM_MARJ && !is_end(lptr)){ lptr = lptr->next; ++*count;/* hangi satr */ gosterge(23, 8, *count, *n); scroll_down_frame(TOP_MARJ, LEFT_MARJ, BOTTOM_MARJ, RIGHT_MARJ, _BLUE | WHITE); _writes(BOTTOM_MARJ, LEFT_MARJ, lptr->str); } break; case ARW_LEFT : if(*n > 0) --*n; if(*col > LEFT_MARJ){ --*col; location(0,*row,*col); } gosterge(23, 8, *count, *n); break; case ARW_RIGHT: if(*n < size) ++*n; if(*col < RIGHT_MARJ){ ++*col; location(0,*row,*col); } gosterge(23, 8, *count, *n); break; case HOME : printf("HOME\n");break; case END : printf("END\n");break; case PG_UP : printf("PG_UP\n");break; case PG_DOWN : printf("PG_DOWN\n");break; case DEL : temp = scrp; scrp = vp; scrp += *row*160 + *col*2; t = *n; for(k = *col;kstr[t] = lptr->str[t+1]; ++t; *scrp = *(scrp+2); scrp += 2; } lptr->str[t] = 0x20; *scrp = 0x20; scrp = temp; break; case INSERT : printf("INSERT\n");break; } /* switch */ } /* EDIT_BLOCK */ else { if(tus.code.ascii == ENTER ){ new_line = line_create(); end_line_add(new_line); lptr = end; if(*row < BOTTOM_MARJ){ ++*row; *col = 1; *n = 0; location(0,*row,*col); } else { scroll_down_frame(TOP_MARJ, LEFT_MARJ, BOTTOM_MARJ, RIGHT_MARJ, _BLUE | WHITE); *col = 1; *n = 0; location(0,*row,*col); } ++*count; /* hangi satr oldu§unun bilgisi */ gosterge(23, 8, *count, *n); } /* ENTER */ else { untam = *status & 0x0f; scrp += *row*160 + *col*2; *scrp = tus.code.ascii; ++*col; location(0, *row, *col); lptr->str[*n] = tus.code.ascii; ++*n; gosterge(23, 8, *count, *n); } /* harfleme */ } } return 1; } sav() { FILE *red,*writ; char isim[12]; char kar; printf("Please enter File name :"); scanf("%s",isim); if((red=fopen("ilker.dat","r"))==1) printf("\nIlker.dat dosyas aclamad\n"); if((writ=fopen(isim,"w"))==1) printf("\nBlrtlen dosya aclamad\n"); while(feof(red)==0) { kar=getc(red); putc(kar,writ); } fcloseall(); } lod() { FILE *red; char isim[12]; char kar; int x,y; brush(_BLUE | WHITE); double_frame(2,0,4,50,BOLD & WHITE | _BLUE); printf("\n\nLoad File"); printf("\n Please enter File name :"); scanf("%s",isim); clrscr(); if((red=fopen(isim,"r"))==1) printf("\nBelrtlen dosya aclamad\n"); x=0;y=2; while(feof(red)==0) { kar=getc(red); if(x < RIGHT_MARJ) ++x; else { x=0; if(ynext = NULL; p->prev = NULL; return p; } /* Enter ile sona satr ekleme */ struct LINE *end_line_add(struct LINE *p) { end->next = p; /* next */ p->prev = end; /* prev */ end = p; } /* Son satr olup olmad§nn kontrol */ int is_end(struct LINE *p) { if(p->next == NULL) return 1; else return 0; } /* ˜lk satr olup olmad§nn kontrol */ int is_first(struct LINE *p) { if(p->prev == NULL) return 1; else return 0; } /* ********************************************************************** */ /* ********************************************************************** */ /* Belli bir satr ve stuna tek bir karakter yazan fonksiyon */ void _writec(int row, int col, int ch) { /* Ekran belle§inin baŸlang‡ adresi */ char far *scrp = vp; /* Ekran belle§inde row, col b”lgesine ilerleniyor */ scrp += row * 160 + col * 2; *scrp = ch; /* Karakter yazlyor */ } /* Belli bir satr ve stundan baŸlayarak ekrana bir string yazmak */ char *_writes(int row, int col, char *str) { char far *scrp = vp; char *temp = str; scrp += row * 160 + col * 2; while(*str != NULL){ *scrp = *str; scrp += 2; ++str; } return temp; } /* Belli bir karakteri ekrana istenilen sayda yazmak */ void _fillc(int row, int col, int ch, int n) { int k; char far *scrp = vp; scrp += row * 160 + col * 2; for(k = 0; k < n; ++k){ *scrp = ch; scrp += 2; } } /* Bir karakteri kolon boyunca istenilen sayda ekrana yazmak */ void _vfillc(int row, int col, int ch, int n) { int k; char far *scrp = vp; scrp += row * 160 + col * 2; for(k = 0; k < n; ++k){ *scrp = ch; scrp += 160; } } /* Verilen bir satr ve stundan itibaren bir stringi n kez yazmak */ char *_writens(int row, int col, char *str, int n) { int count; char *temp = str; char far *scrp = vp; scrp += row * 160 + col * 2; for(count = 0; count < n; ++count){ while(*str != NULL){ *scrp = *str; scrp += 2; ++str; } str = temp; } return temp; } /* Verilen bir satr ve stuna attribute'lu tek karakter yazan fonksiyon */ void writec(int row, int col, int ch, int attr) { char far *scrp = vp; /* Ekran belle§inin baŸlang‡ adresi */ /* Ekran belle§inde row, col b”lgesine ilerleniyor */ scrp += row * 160 + col * 2; *scrp++ = ch; /* Karakter yazlyor */ *scrp = attr; /* ™zellik bilgisi yazlyor */ } /* Ekrann istenen satr ve stununa, ”zelli§i ile birlikte string yazmak */ char *writes(int row, int col, char *str, int attr) { char far *scrp = vp; char *temp = str; scrp += row * 160 + col * 2; while(*str != NULL){ *scrp++ = *str; *scrp++ = attr; ++str; } return temp; } /* Ekrann istenen satr ve stununa ”zelli§i ile birlikte, belli bir karakteri n kez yazmak */ void fillc(int row, int col, int ch, int n, int attr) { int k; char far *scrp = vp; scrp += row * 160 + col * 2; for(k = 0; k < n; ++k){ *scrp++ = ch; *scrp++ = attr; } } /* Belli bir koordinattan baŸlayarak kolon boyunca ”zelli§i ile birlikte n tane karakteri yazmak */ void vfillc(int row, int col, int ch, int n, int attr) { int k; char far *scrp = vp; scrp += row * 160 + col * 2; for(k = 0; k < n; ++k){ *scrp = ch; *(scrp+1) = attr; scrp += 160; } } /* Bir stringi n kez ”zellikli yazmak */ char *writens(int row, int col, char *str, int n, int attr) { int count; char *temp = str; char far *scrp = vp; scrp += row * 160 + col * 2; for(count = 0; count < n; ++count){ while(*str != NULL){ *scrp++ = *str; *scrp++ = attr; ++str; } str = temp; } return temp; } /* ™zelliksiz ‡er‡eve */ void _frame(int row1, int col1, int row2, int col2) { _writec(row1, col1, C_UL); /* K”Ÿe karakterleri */ _writec(row1, col2, C_UR); _writec(row2, col1, C_LL); _writec(row2, col2, C_LR); _vfillc(row1+1, col1, C_V, row2-row1-1); /* DŸey ‡izgiler */ _vfillc(row1+1, col2, C_V, row2-row1-1); _fillc(row1, col1+1, C_H, col2-col1-1); /* Yatay ‡izgiler */ _fillc(row2, col1+1, C_H, col2-col1-1); } /* Verilen koordinatlarda tek cizgili ‡er‡eve ‡izmek */ void frame(int row1, int col1, int row2, int col2, int attr) { writec(row1, col1, C_UL, attr); /* K”Ÿe karakterleri */ writec(row1, col2, C_UR, attr); writec(row2, col1, C_LL, attr); writec(row2, col2, C_LR, attr); vfillc(row1+1, col1, C_V, row2-row1-1, attr); /* DŸey ‡izgiler */ vfillc(row1+1, col2, C_V, row2-row1-1, attr); fillc(row1, col1+1, C_H, col2-col1-1, attr); /* Yatay ‡izgiler */ fillc(row2, col1+1, C_H, col2-col1-1, attr); } /* Verilen koordinatlarda ‡ift cizgili ‡er‡eve ‡izmek */ void double_frame(int row1, int col1, int row2, int col2, int attr) { writec(row1, col1, C_ULD, attr); /* K”Ÿe karakterleri */ writec(row1, col2, C_URD, attr); writec(row2, col1, C_LLD, attr); writec(row2, col2, C_LRD, attr); vfillc(row1+1, col1, C_VD, row2-row1-1, attr); /* DŸey ‡izgiler */ vfillc(row1+1, col2, C_VD, row2-row1-1, attr); fillc(row1, col1+1, C_HD, col2-col1-1, attr); /* Yatay ‡izgiler */ fillc(row2, col1+1, C_HD, col2-col1-1, attr); } void brush(int attr) { /* writec(0, 0, C_ULD, attr);*/ char far *scrp = vp; int k; scrp += 1; for(k = 0; k < 2000; ++k){ *scrp = attr; scrp += 2; } } /* ********************************************************************** */ /* Krs”rn hangi satr ve stnda oldu§unu g”steren eden fonksiyon */ void gosterge(int row, int col, int deg1, int deg2) { char str1[6], str2[6], strprn[13]; itoa(deg1, str1, 10); itoa(deg2 + 1, str2, 10); strcpy(strprn, " "); strcat(strprn, str1); strcat(strprn, ":"); strcat(strprn, str2); strcat(strprn, " "); _writes(row, col, strprn); } /* Verilen aralklarda scroll iŸlemi yapan fonksiyon */ void scroll_down_frame(int row1, int col1, int row2, int col2, int attr) { char far *scrp; int k, i; for(k = row1; k < row2; ++k) { scrp = (char far *)0XB8000000; scrp += k * 160 + col1 * 2; for(i = col1; i <= col2; ++i) { *scrp++ = *(scrp + 160); *scrp++ = *(scrp + 160); } } scrp = (char far *)0XB8000000; scrp += row2 * 160 + col1 * 2; for(i = col1; i <= col2; ++i) { *scrp++ = 0X20; *scrp++ = attr; } } /* Yukar ok kullanarak 1 satr yukar scroll iŸlemi */ void scroll_up_frame(int row1, int col1, int row2, int col2, int attr) { char far *scrp; int k, i; for(k = row2; k > row1; --k) { scrp = (char far *)0XB8000000; scrp += k * 160 + col1 * 2; for(i = col1; i <= col2; ++i) { *scrp++ = *(scrp - 160); *scrp++ = *(scrp - 160); } } scrp = (char far *)0XB8000000; scrp += row1 * 160 + col1 * 2; for(i = col1; i <= col2; ++i) { *scrp++ = 0X20; *scrp++ = attr; } }