수정한 부분
1. 문자가 화면크기 보다 많을때 커서의 위치에 따라 화면 출력
(오른쪽, 왼쪽, Home, End, Backspace, delete 및 문자 입력시 커서의 위치에 기준한 화면 출력)
2. 문자 입력에 따른 카운트라인 수정(글자와 함께 생성되고 100단위로 색변화됨)
3. 글자를 찍을수 있는 최대 갯수 250으로 지정
4. Insert 키 기능 추가
5. Load 혹은 Save as 시 엔터키나 특수키 입력시 생기는 오류 수정.
6. Load 혹은 Save as 시 최대 글자 갯수 8 -> 12로 수정
7. 파일 분할 및 정리
File : OneEdit.h - 디파인된 목록과 구조체 및 함수
File : oneline.c - 전역 변수, 메인함수, 초기화함수가 포함됨
File : DrowMap.c - 전체 배경화면을 그리는 함수
File : PushKey.c - 문자입력, delete, backspace 키 입력시 발생되는 함수
File : Cursor_Ef.c -커서관련된 효과함수
File : SaveLoad.c - 세이브와 로드 함수
File : Keybord.c - 키보드에서 입력하는 키를 읽어서 명령전달함수
File : F10_Key.c - F10키 입력시 메뉴창활성 및 선택시 명령전달
File : NewNode.c - 새로운 노드(문자)추가시 링크연결
File : DelNode.c - 노드(문자)삭제시 링크 제거
File : PrintNode.c - 화면에 커서기준으로 양옆으로 문자 출력
File : Help_Popup.c - 도움말창 그리기
File : Other_Drow.c - 반복되는 그리기를 위한 함수들
1. 문자가 화면크기 보다 많을때 커서의 위치에 따라 화면 출력
(오른쪽, 왼쪽, Home, End, Backspace, delete 및 문자 입력시 커서의 위치에 기준한 화면 출력)
2. 문자 입력에 따른 카운트라인 수정(글자와 함께 생성되고 100단위로 색변화됨)
3. 글자를 찍을수 있는 최대 갯수 250으로 지정
4. Insert 키 기능 추가
5. Load 혹은 Save as 시 엔터키나 특수키 입력시 생기는 오류 수정.
6. Load 혹은 Save as 시 최대 글자 갯수 8 -> 12로 수정
7. 파일 분할 및 정리
File : OneEdit.h - 디파인된 목록과 구조체 및 함수
#ifndef _ONELINE_H #define _ONELINE_H #include#include #include #include #include #include #include #define RAMADD ((char far *)0xb8000000) #define DEF_FILE "oneline.txt" #define TOP_L 218 #define WIDTH 196 #define TOP_R 191 #define HEIGHT 179 #define LOW_L 192 #define LOW_R 217 #define H_L_color 0x70 #define M_color 0x70 #define BG_color 0x80 #define EX_color 0x07 #define ALLBLACK 0x0f #define DOWN 80 #define UP 72 #define LEFT 75 #define RIGHT 77 #define ESC 27 #define F10 68 #define ENTER 13 #define ALTX 45 #define ALTN 49 #define ALTL 38 #define ALTS 31 #define ALTA 30 #define ALTE 18 #define F1 59 #define BACKSPACE 8 #define INSERT 82 #define DELETE 83 #define HOME 71 #define END 79 #pragma pack(1) typedef struct _char_tag { char character; unsigned char cNumber; struct _char_tag *prev; struct _char_tag *next; }char_tag; typedef struct _move_XY { unsigned char x; unsigned char y; }xy_point; #pragma pack() //*******************************************************oneline.c void init(void); //*******************************************************DrowMap.c void print_drow_interface(void); void Drow_Frame(char ch, char attr, char x, char y); void Drow_background(void); void Drow_high(void); void Drow_middle(void); void Drow_middle2(void); void Drow_low(void); void Drow_menu_high(void); void Drow_menu_low(void); void Drow_count_line(char x, char_tag *temp); void Drow_Null(char ch, char attr, char x, char y, char max); void Print_Line(char y); //******************************************************Help_Popup.c void Drow_help(void); void Drow_help_middle(char *print_string, char x, char y, char first, char last); //*******************************************************Other_Drow.c char String_print(char* Sch, char x, char y, char effect, char last_e); void Drow_Filename(char *Filename); void popup_window(char *print_string, char first, char last); //*******************************************************Cursor_Ef.c void move_cursor(char page, char x, char y); void cursor_off(void); void cursor_on(void); void inverse_attrib(unsigned char far *attrib); void inverse_bar(char x, char y, char length); //*******************************************************NewNode.c char count_node(void); char_tag* make_new_node(char cTemp); void insert_node(char_tag *Newnode); //*******************************************************DelNode.c void backspace_key(void); void delete_key(void); void all_free(void); //*******************************************************PrintNode.c void print_node_screen(void); void first_print_num(char x, char y); void last_print_num(char x, char y); void first_print_char(char x, char y); void last_print_char(char x, char y); //******************************************************SaveLoad.c void save_file(char *File_name); char load_file(char *File_name); char* input_filename(char x); void clear_screen(char* FileName); //*****************************************************Keybord.c char key_control(void); void Left_Key(void); void Right_Key(void); void Home_Key(void); void End_Key(void); //******************************************************F10_Key.c void F10_case(char menu); char menu_action(char menu); //*****************************************************PushKey.c void backspace_node(void); void delete_node(void); void character_key(void); void max_character_end(char_tag* Newnode); #endif
File : oneline.c - 전역 변수, 메인함수, 초기화함수가 포함됨
#include "oneEdit.h"
char_tag *head; //노드의 헤드포인터
char_tag *now_cur; //현재커서의 포인터
xy_point movexy; //커서의 좌표위치
char clear_buf[25*80*2]; //최초의 화면저장 버퍼
char filename_buf[60]; //파일이름 저장버퍼
char insert_key; //insert키 설정변수
int main(void)
{
char_tag *Newnode; //새로운 노드생성 포인트
char cTemp; //키입력시 명령선택변수
char insert_temp; //Insert키입력시 문자 임시 저장변수
// 화면 인터페이스 그리기
print_drow_interface();
//좌표와 헤드 초기화 그리고 버퍼에 화면저장
init();
gettext(0, 0, 79, 24, clear_buf); //전체화면 저장
Drow_Filename(DEF_FILE); //파일이름 화면에 그리기
gettext(25,6,60,6, filename_buf); //파일이름부분만 저장
//키보드로 명령을 입력받아 실행
while(1)
{
cTemp = key_control();
//이동키나 특수키 입력시
if(cTemp == -1) continue;
//backspace 입력시
if(cTemp == -2)
{
backspace_key();
continue;
}
//delete 입력시
if(cTemp == -3)
{
delete_key();
continue;
}
//문자 입력시
if(cTemp > 31 && cTemp <127)
{
Newnode = make_new_node(cTemp); //새노드 생성
if(insert_key == 1){ //insert키 활성일때
if(now_cur->next == NULL){ //커서뒤에글자가 없을때
if(Newnode->cNumber > 250) //글자가 MAX일때
{
max_character_end(Newnode);
continue;
}
insert_node(Newnode);
character_key();
continue;
}
insert_temp = Newnode->character; //Insert 활성시 문자만 임시저장
now_cur->next->character = insert_temp; //Insert 활성시 문자교체
free(Newnode); //새노드 제거
Right_Key(); //키 이동
continue;
}
if(Newnode->cNumber > 250) //글자가 MAX 일때
{
max_character_end(Newnode);
continue;
}
insert_node(Newnode);
character_key();
}
}
}
//헤드와 좌표 초기화
void init(void)
{
head = (char_tag*)malloc(sizeof(char_tag)); //헤드 초기화
head = NULL;
head->next = NULL;
head->prev = NULL;
now_cur = head; //현재커서 초기화
insert_key = 0; //Insert키 초기화
movexy.x = 4; //좌표 초기화
movexy.y = 12;
}
File : DrowMap.c - 전체 배경화면을 그리는 함수
#include"oneEdit.h"
//전체적인 바탕그리는 함수 모음
void print_drow_interface(void)
{
Drow_background();
Drow_high();
Drow_middle();
Drow_middle2();
Drow_low();
Drow_menu_high();
Drow_menu_low();
Print_Line(5);
Print_Line(17);
}
//모든 그리기에 사용되는 RAM에 출력문자 입력
void Drow_Frame(char ch, char attr, char x, char y)
{
char far *location;
location = RAMADD + y*160 + x*2;
*location++ = ch;
*location = attr;
}
//전체 배경
void Drow_background(void)
{
char i;
char j;
for(i = 0; i < 25; ++i){
for(j = 0; j < 80; ++j){
Drow_Frame(' ',BG_color, j, i);
}
}
}
//맨위의 메뉴가 들어가는 창 그리기
void Drow_high(void)
{
char i;
Drow_Frame(TOP_L, H_L_color, 1, 1);
for(i = 2 ; i < 78; ++i){
Drow_Frame(WIDTH, H_L_color, i, 1);
}
Drow_Frame(TOP_R, H_L_color, 78, 1);
Drow_Frame(HEIGHT, H_L_color, 1, 2);
Drow_Frame(HEIGHT, H_L_color, 78, 2);
Drow_Frame(LOW_L, H_L_color, 1, 3);
for(i = 2 ; i < 78; ++i){
Drow_Frame(WIDTH, H_L_color, i, 3);
}
Drow_Frame(LOW_R, H_L_color, 78, 3);
}
//가운데 입력 출력 되는 창
//바깥 라인
void Drow_middle(void)
{
char i;
Drow_Frame(TOP_L, M_color, 1, 7);
for(i = 2 ; i < 78; ++i){
Drow_Frame(WIDTH, M_color, i, 7);
}
Drow_Frame(TOP_R, M_color, 78, 7);
for(i = 8; i < 15; ++i){
Drow_Frame(HEIGHT, M_color, 1, i);
Drow_Frame(HEIGHT, M_color, 78, i);
}
Drow_Frame(LOW_L, M_color, 1, 15);
for(i = 2 ; i < 78; ++i){
Drow_Frame(WIDTH, M_color, i, 15);
}
Drow_Frame(LOW_R, M_color, 78, 15);
}
//안쪽 라인
void Drow_middle2(void)
{
char i;
Drow_Frame(TOP_L, ALLBLACK, 2, 8);
for(i = 3 ; i < 77; ++i){
Drow_Frame(WIDTH, ALLBLACK, i, 8);
}
Drow_Frame(TOP_R, ALLBLACK, 77, 8);
for(i = 9; i < 14; ++i){
Drow_Frame(HEIGHT, ALLBLACK, 2, i);
Drow_Null(' ',H_L_color, 3, i, 77);
Drow_Frame(HEIGHT, ALLBLACK, 77, i);
}
Drow_Frame(LOW_L, ALLBLACK, 2, 14);
for(i = 3 ; i < 77; ++i){
Drow_Frame(WIDTH, ALLBLACK, i, 14);
}
Drow_Frame(LOW_R, ALLBLACK, 77, 14);
}
//화면 하단의 메뉴가 들어가는 창 그리기
void Drow_low(void)
{
char i;
Drow_Frame(TOP_L, H_L_color, 1, 19);
for(i = 2 ; i < 78; ++i){
Drow_Frame(WIDTH, H_L_color, i, 19);
}
Drow_Frame(TOP_R, H_L_color, 78, 19);
for(i = 20; i < 23; ++i){
Drow_Frame(HEIGHT, H_L_color, 1, i);
Drow_Frame(HEIGHT, H_L_color, 78, i);
}
Drow_Frame(LOW_L, H_L_color, 1, 23);
for(i = 2 ; i < 78; ++i){
Drow_Frame(WIDTH, H_L_color, i, 23);
}
Drow_Frame(LOW_R, H_L_color, 78, 23);
}
//위쪽 메뉴 글자 그리기
void Drow_menu_high(void)
{
char Sch[20];
char x;
x = 2;
Drow_Null(' ',H_L_color, x, 2, 10);
x = 10;
strcpy(Sch, "New");
x = String_print(Sch, x, 2, 0, 0);
Drow_Null(' ',H_L_color, x, 2, 20);
x = 20;
strcpy(Sch, "Load");
x = String_print(Sch, x, 2, 0, 0);
Drow_Null(' ',H_L_color, x, 2, 30);
x = 30;
strcpy(Sch, "Save");
x = String_print(Sch, x, 2, 0, 0);
Drow_Null(' ',H_L_color, x, 2, 39);
x = 39;
strcpy(Sch, "Save As");
x = String_print(Sch, x, 2, 5, 5);
Drow_Null(' ',H_L_color, x, 2, 50);
x = 50;
strcpy(Sch, "Exit");
x = String_print(Sch, x, 2, 0, 0);
Drow_Null(' ',H_L_color, x, 2, 78);
return;
}
//화면 하단의 메뉴 글자
void Drow_menu_low(void)
{
char Sch[20];
char x;
x = 2;
Drow_Null(' ',H_L_color, x, 20, 78);
Drow_Null(' ',H_L_color, x, 21, 10);
x = 10;
strcpy(Sch, "F10 - MENU");
x = String_print(Sch, x, 21, 0, 3);
Drow_Null(' ',H_L_color, x, 21, 30);
x = 30;
strcpy(Sch, "ALT + x - EXIT");
x = String_print(Sch, x, 21, 0, 7);
Drow_Null(' ',H_L_color, x, 21, 55);
x = 55;
strcpy(Sch, "F1 - HELP");
x = String_print(Sch, x, 21, 0, 2);
Drow_Null(' ',H_L_color, x, 21, 78);
x = 2;
Drow_Null(' ',H_L_color, x, 22, 78);
return;
}
//그외 빈 공간
void Drow_Null(char ch, char attr, char x, char y, char max)
{
for( ; x < max; ++x)
{
Drow_Frame(ch, attr, x, y);
}
}
//중간 라인 그리기
void Print_Line(char y)
{
int i;
for(i = 0; i < 80; ++i){
Drow_Frame(WIDTH, BG_color, i, y);
}
}
//카운트 라인 그리기
void Drow_count_line(char x, char_tag *temp)
{
char i;
char j;
char sum;
char num;
sum = temp->cNumber / 10;
num = temp->cNumber % 10;
if(num == 0)
{
if(sum < 10){
Drow_Frame(sum+48 ,0x7f, x, 9);
}
else if(sum >= 10 && sum < 20){
sum = sum - 10;
Drow_Frame(sum+48 ,0x7c, x, 9);
}
else{
sum = sum - 20;
Drow_Frame(sum+48 ,0x7e, x, 9);
}
}
else
{
if(sum < 10){
Drow_Frame(WIDTH,0x7f, x, 9);
}
else if(sum >= 10 && sum < 20){
Drow_Frame(WIDTH,0x7c, x, 9);
}
else{
Drow_Frame(WIDTH,0x7e, x, 9);
}
}
}
File : PushKey.c - 문자입력, delete, backspace 키 입력시 발생되는 함수
#include"oneEdit.h"
extern xy_point movexy; //커서의 좌표위치
extern char clear_buf[25*80*2]; //최초의 화면저장 버퍼
extern char filename_buf[60]; //파일이름 저장버퍼
//backspace키 입력시 문자 출력 및 커서조정
void backspace_key(void)
{
backspace_node();
movexy.x--;
if(movexy.x < 4){
movexy.x = 4;
}
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
movexy.y = 12;
move_cursor(0, movexy.x, movexy.y);
}
//delete키 입력시 문자 출력 및 커서조정
void delete_key(void)
{
delete_node();
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
movexy.y = 12;
move_cursor(0, movexy.x, movexy.y);
}
//문자키 입력시 문자 출력 및 커서 위치 조정
void character_key(void)
{
movexy.x++;
if(movexy.x > 75){
movexy.x = 75;
}
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
movexy.y = 12;
move_cursor(0, movexy.x, movexy.y);
}
//라인에 출력할수 있는 최대의 문자 갯수를 초과할 시
void max_character_end(char_tag* Newnode)
{
popup_window("Line End!! ", 0 , 10);
getch();
free(Newnode);
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
}
File : Cursor_Ef.c -커서관련된 효과함수
#include"oneEdit.h"
//**in Pdf File...
// 커서 이동
void move_cursor(char page, char x, char y)
{
union REGS regs;
regs.h.ah = 2;
regs.h.dh = y;
regs.h.dl = x;
regs.h.bh = page;
int86(0x10, ®s, ®s);
}
//커서 깜빡임 끔
void cursor_off(void)
{
union REGS regs;
regs.h.ah = 1;
regs.h.ch = 0x20;
regs.h.cl = 0;
int86(0x10, ®s, ®s);
}
//커서 깜빡임 켜기
void cursor_on(void)
{
union REGS regs;
regs.h.ah = 1;
regs.h.ch = 0x0B;
regs.h.cl = 0x0C;
int86(0x10, ®s, ®s);
}
//메뉴 선택시 글자 반전
void inverse_attrib(unsigned char far *attrib)
{
unsigned char origin;
origin = *attrib;
*attrib >>= 4;
*attrib = *attrib & 0x0f;
origin <<= 4;
*attrib = *attrib | origin;
}
void inverse_bar(char x, char y, char length)
{
char i = 0;
unsigned char far *attr_memory = (unsigned char far *) 0xb8000001L;
attr_memory = attr_memory + y * 160 + x * 2;
for(i = 0; i < length; ++i)
{
inverse_attrib(attr_memory);
attr_memory += 2;
}
}
File : SaveLoad.c - 세이브와 로드 함수
#include"oneEdit.h"
extern char clear_buf[25*80*2]; //최초의 화면저장 버퍼
extern char filename_buf[60]; //파일이름 저장버퍼
extern xy_point movexy; //커서의 좌표위치
extern char_tag *head; //노드의 헤드포인터
// 세이브 함수
void save_file(char *File_name)
{
char iFd;
char iRet;
char buffer;
char_tag *write_temp;
write_temp = head->next;
iFd = open(File_name, O_RDWR | O_TEXT | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE);
if(iFd == -1)
{
popup_window("File Open Error! ",9 , 15);
getch();
exit(0);
}
while(write_temp != NULL)
{
buffer = write_temp->character;
iRet = write(iFd, &buffer, sizeof(char));
if(iRet != sizeof(char))
{
popup_window("Write to file is error! ",16 , 22);
getch();
exit(0);
}
write_temp = write_temp->next;
}
close(iFd);
popup_window("Save is Succese! ",0 , 4);
getch();
}
//파일 불러오기
char load_file(char *File_name)
{
char iFd;
char iRet;
char buffer;
char_tag *read_temp;
iFd = open(File_name, O_RDWR);
if(iFd == -1)
{
popup_window("File is Nothing!! ",7 , 17);
getch();
return -1;
}
//현재 데이터 초기화
all_free();
init();
//로드 데이터 연결
while(1)
{
iRet = read(iFd, &buffer, sizeof(char));
if(iRet != sizeof(char))
{
break;
}
read_temp = (char_tag*)malloc(sizeof(char_tag));
read_temp->character = buffer;
read_temp->next = NULL;
read_temp->prev = NULL;
read_temp->cNumber = count_node();
insert_node(read_temp);
movexy.x++;
if(movexy.x > 74)
{
movexy.x = 74;
}
}
close(iFd);
popup_window("Load is Succese! ",0 , 4);
getch();
return 0;
}
//파일 이름 입력 함수
char* input_filename(char x)
{
char temp;
char count = 0;
char FileName[20];
char y;
char low;
y = 11;
move_cursor(0, x, y);
low = x;
while(1)
{
temp = getch();
if(temp > 31 && temp < 127)
{
FileName[count] = temp;
count++;
Drow_Frame(temp, 0x71, x, y);
x++;
move_cursor(0, x, y);
}
else if(temp == ENTER)
break;
else if(temp == ESC)
{
FileName[0] = '\0';
break;
}
else if(temp == BACKSPACE)
{
count--;
if(count < 0)
count = 0;
x--;
if(x < low)
x = low;
Drow_Frame(' ', 0x71, x, y);
}
}
FileName[count] = '\0';
return FileName;
}
//세이브나 로드시 창 초기화
void clear_screen(char *FileName)
{
puttext(0, 0, 79, 24, clear_buf);
Drow_Filename(FileName);
gettext(25,6,60,6, filename_buf);
}
File : Keybord.c - 키보드에서 입력하는 키를 읽어서 명령전달함수
#include"oneEdit.h"
extern char_tag *head; //노드의 헤드포인터
extern char_tag *now_cur; //현재커서의 포인터
extern xy_point movexy; //커서의 좌표위치
extern char clear_buf[25*80*2]; //최초의 화면저장 버퍼
extern char filename_buf[60]; //파일이름 저장버퍼
extern char insert_key; //insert키 설정변수
//키보드 입력시 발생하는 이벤트들
char key_control(void)
{
unsigned char presskey;
char exit_key;
char menu_buf[25*80*2];
gettext(0, 0, 79, 24, menu_buf);
move_cursor(0, movexy.x, movexy.y);
presskey = getch();
//아스키 코드가 확장형 키들
if(presskey == 0){
presskey = getch();
switch(presskey){
case UP:
case DOWN:
break;
case LEFT:
Left_Key();
break;
case RIGHT:
Right_Key();
break;
case F10:
F10_case(1);
break;
case ALTN:
F10_case(1);
break;
case ALTL:
F10_case(2);
break;
case ALTS:
F10_case(3);
break;
case ALTA:
F10_case(4);
break;
case ALTE:
F10_case(5);
break;
case ALTX:
cursor_off();
popup_window("Program Exit (push AnyKey or cancle ESC key).", 8 , 12);
exit_key = getch();
if(exit_key == ESC)
{
puttext(0, 0, 79, 24, menu_buf);
cursor_on();
break;
}
all_free();
exit(0);
case F1:
cursor_off();
Drow_help();
while(1){
exit_key = getch();
if(exit_key == ESC)
{
puttext(0, 0, 79, 24, menu_buf);
break;
}
}
cursor_on();
break;
case HOME:
Home_Key();
break;
case END:
End_Key();
break;
case DELETE:
return -3;
case INSERT:
if(insert_key == 0){
String_print("", 4, 7, 0, 8);
insert_key = 1;
}
else if(insert_key == 1){
insert_key = 0;
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
}
break;
}
}
else if(presskey == ENTER){
return -1;
}
else if(presskey == BACKSPACE){
return -2;
}
else{
return presskey;
}
return -1;
}
//Left 키 입력시 일어나는 현상(커서이동, 포인터이동, 화면재출력)
void Left_Key(void)
{
now_cur = now_cur->prev;
if(now_cur == NULL)
{
now_cur = head;
}
movexy.x--;
if(movexy.x < 4)
movexy.x = 4;
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
move_cursor(0, movexy.x, movexy.y);
}
//Right 키 입력시 일어나는 현상(커서이동, 포인터이동, 화면재출력)
void Right_Key(void)
{
if(now_cur->next != NULL){
now_cur = now_cur->next;
movexy.x++;
if(movexy.x > 75)
movexy.x = 75;
}
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
move_cursor(0, movexy.x, movexy.y);
}
//Home 키 입력시 일어나는 현상(커서이동, 포인터이동, 화면재출력)
void Home_Key(void)
{
movexy.x = 4;
now_cur = head;
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
move_cursor(0, movexy.x, movexy.y);
}
//End 키 입력시 일어나는 현상(커서이동, 포인터이동, 화면재출력)
void End_Key(void)
{
unsigned char Last_node_cnt;
Last_node_cnt = count_node();
movexy.x = Last_node_cnt+4;
while(now_cur->next != NULL)
now_cur = now_cur->next;
if(movexy.x > 75)
movexy.x = 75;
puttext(0, 0, 79, 24, clear_buf);
puttext(25,6,60,6, filename_buf);
print_node_screen();
move_cursor(0, movexy.x, movexy.y);
}
File : F10_Key.c - F10키 입력시 메뉴창활성 및 선택시 명령전달
#include"oneEdit.h"
//F10키 입력시 메뉴창
void F10_case(char menu)
{
xy_point f10move;
char f10_buf[25*80*2];
unsigned char presskey;
char menu_sum;
cursor_off();
switch(menu)
{
case 1:
f10move.x = 7;
f10move.y = 2;
break;
case 2:
f10move.x = 17;
f10move.y = 2;
break;
case 3:
f10move.x = 27;
f10move.y = 2;
break;
case 4:
f10move.x = 37;
f10move.y = 2;
break;
case 5:
f10move.x = 47;
f10move.y = 2;
break;
}
gettext(0, 0, 79, 24, f10_buf);
inverse_bar(f10move.x, f10move.y, 10);
//메뉴 선택시 메뉴바 이동
do{
presskey = getch();
switch(presskey){
case RIGHT:
f10move.x += 10;
if(f10move.x > 47){
f10move.x = 47;
}
puttext(0, 0, 79, 24, f10_buf);
inverse_bar(f10move.x, f10move.y, 10);
break;
case LEFT:
f10move.x -= 10;
if(f10move.x > 70){
f10move.x = 7;
}
puttext(0, 0, 79, 24, f10_buf);
inverse_bar(f10move.x, f10move.y, 10);
break;
case ESC:
puttext(0, 0, 79, 24, f10_buf);
break;
//해당 메뉴 선택시
case ENTER:
menu_sum = menu_action(f10move.x);
if(menu_sum == -1)
{
presskey = ESC;
}
break;
}
}while(presskey != ESC);
cursor_on();
return;
}
//메뉴 선택시 나타나는 이벤트들..
char menu_action(char menu)
{
char exit_key;
char menu_buf[25*80*2];
static char FileName[20] = DEF_FILE; //default 저장파일
char temp[20];
char check;
gettext(0, 0, 79, 24, menu_buf);
switch(menu)
{
//새로하기(New)
case 7:
save_file(FileName);
all_free();
init();
popup_window("SCREEN is Clear! ",9, 15);
getch();
clear_screen(FileName);
return -1;
//불러오기(Load)
case 17:
popup_window("Input Load File name :" ,0, 5);
strcpy(temp,input_filename(43));
check = load_file(temp);
if(check == -1)
{
clear_screen(FileName);
print_node_screen();
return -1;
}
strcpy(FileName,temp);
clear_screen(FileName);
print_node_screen();
return -1;
//저장하기(Save)
case 27:
save_file(FileName);
clear_screen(FileName);
print_node_screen();
return -1;
//다른이름저장(Save As)
case 37:
popup_window("Input File name :" ,0, 5);
strcpy(temp, FileName);
strcpy(FileName, input_filename(54));
check = strlen(FileName);
if(check < 1){
strcpy(FileName, temp);
clear_screen(FileName);
print_node_screen();
return -1;
}
//파일이름이 12글자 이상일때
if(check > 12){
strcpy(FileName, temp);
popup_window("File Name is Long!! 12 Charact Low~" ,5, 10);
getch();
clear_screen(FileName);
print_node_screen();
return -1;
}
save_file(FileName);
clear_screen(FileName);
print_node_screen();
return -1;
//종료(Exit)
case 47:
popup_window("Program Exit (push AnyKey or cancle ESC key).", 8 , 12);
exit_key = getch();
if(exit_key == ESC)
{
puttext(0, 0, 79, 24, menu_buf);
break;
}
all_free();
exit(0);
}
return 0;
}
File : NewNode.c - 새로운 노드(문자)추가시 링크연결
#include"oneEdit.h"
extern char_tag *head; //노드의 헤드포인터
extern char_tag *now_cur; //현재커서의 포인터
//노드의 갯수를 알기위하여
char count_node(void)
{
char_tag* count;
char cnt = 0;
for(count = head->next ; count ; count = count->next)
{
cnt++;
}
return cnt;
}
//새로운 노드 생성
char_tag* make_new_node(char cTemp)
{
char_tag* Newnode;
Newnode = (char_tag*)malloc(sizeof(char_tag));
Newnode->character = cTemp;
Newnode->cNumber = count_node();
Newnode->next = NULL;
Newnode->prev = NULL;
return Newnode;
}
//노드를 삽입 추가
void insert_node(char_tag *Newnode)
{
char_tag *current;
char_tag *fallow;
char count;
//처음노드생성시
if(head->next == NULL)
{
head->next = Newnode;
Newnode->prev = head;
now_cur = now_cur->next;
return;
}
fallow = now_cur;
current = now_cur->next;
//커서가 가장처음 위치할때
if(fallow == head && current != NULL)
{
Newnode->next = current;
Newnode->prev = head;
current->prev = Newnode;
head->next = Newnode;
now_cur = Newnode;
Newnode->cNumber = current->cNumber;
while(current != NULL)
{
current->cNumber++;
current = current->next;
}
return;
}
//노드의 가장끝에 추가할때
if(current == NULL)
{
Newnode->prev = fallow;
fallow->next = Newnode;
now_cur = Newnode;
return;
}
//노드가 단 하나 생성 되었을때
if(fallow == head->next && current == NULL)
{
Newnode->next = current;
Newnode->prev = fallow;
fallow->next = Newnode;
now_cur = Newnode;
return;
}
//커서가 노드가운데 위치하여 삽입할때
Newnode->next = current;
Newnode->prev = fallow;
current->prev = Newnode;
fallow->next = Newnode;
now_cur = Newnode;
Newnode->cNumber = current->cNumber;
while(current != NULL)
{
current->cNumber++;
current = current->next;
}
}
File : DelNode.c - 노드(문자)삭제시 링크 제거
#include"oneEdit.h"
extern char_tag *head; //노드의 헤드포인터
extern char_tag *now_cur; //현재커서의 포인터
//백스페이스 키
void backspace_node(void)
{
char_tag *now;
char_tag *right;
char_tag *left;
char count;
//글자가 없을때
if(head->next == NULL)
{
return;
}
//now,right,left 설정
now = now_cur;
right = now_cur->next;
left = now_cur->prev;
//커서가 처음에 위치할때
if(now == head)
{
return;
}
//커서가 맨 마지막에 있을때
if(right == NULL)
{
left->next = NULL;
free(now);
now_cur = left;
return;
}
//커서가 중간에 있어서 글자삭제할때
right->prev = left;
left->next = right;
free(now);
now_cur = left;
//삭제후 뒤에있는 노드들의 넘버를 하나씩 줄임
while(right != NULL)
{
right->cNumber--;
right = right->next;
}
return;
}
//delete키 입력시
void delete_node(void)
{
char_tag *now;
char_tag *right;
char_tag *left;
char count;
//now 와 right 위치 지정
now = now_cur->next;
right = now->next;
left = now_cur;
//글자가 없거나 커서가 마지막에 있을때
if(head->next == NULL || now == NULL )
{
return;
}
//커서가 가장처음에 위치했을때
if(left == head)
{
head->next = right;
if(right != NULL)
{
right->prev = head;
}
free(now);
while(right != NULL)
{
right->cNumber--;
right = right->next;
}
return;
}
//커서가 중간부분에 있을때
left = now->prev;
left->next = right;
right->prev = left;
free(now);
while(right != NULL)
{
right->cNumber--;
right = right->next;
}
return;
}
//메모리상에서 모든 노드를 free
void all_free(void)
{
char_tag* temp;
for(temp = head->next; temp ; temp = head ->next)
{
head->next = temp->next;
free(temp);
}
free(head);
}
File : PrintNode.c - 화면에 커서기준으로 양옆으로 문자 출력
#include"oneEdit.h"
extern char_tag *now_cur; //현재커서의 포인터
extern xy_point movexy; //커서의 좌표위치
extern char insert_key; //insert키 설정변수
//화면 출력함수
void print_node_screen(void)
{
char x;
char y;
//테스트용(현재커서포인터의글자 , 글자번호)
/*
x = 4;
y = 14;
move_cursor(0, x, y);
printf("%c , %d",now_cur->character, now_cur->cNumber);
*/
if(insert_key == 1)
{
String_print("", 4, 7, 0, 8);
}
x = movexy.x;
first_print_num(x, 10);
x = movexy.x;
last_print_num(x, 10);
x = movexy.x;
first_print_char(x, 12);
x = movexy.x;
last_print_char(x, 12);
move_cursor(0, movexy.x, movexy.y);
}
//현재 위치로 부터 화면 마지막까지 번호출력
void first_print_num(char x, char y)
{
char_tag* temp;
char num;
move_cursor(0, x, y);
for(temp = now_cur->next; temp ; temp = temp->next)
{
if(x > 74) break;
num = temp->cNumber %10;
Drow_Frame(48+num, 0x78, x, y);
Drow_count_line(x, temp);
x++;
}
}
//현재 위치로 부터 화면 처음까지 번호 출력
void last_print_num(char x, char y)
{
char_tag* temp;
char num;
move_cursor(0, x, y);
for(temp = now_cur; 1 ; temp = temp->prev)
{
x--;
if(x < 4) break;
num = temp->cNumber %10;
Drow_Frame(48+num, 0x78, x, y);
Drow_count_line(x, temp);
}
}
//현재 위치로 부터 화면 마지막까지 문자 출력
void first_print_char(char x, char y)
{
char_tag* temp;
move_cursor(0, x, y);
for(temp = now_cur->next; temp ; temp = temp->next)
{
if(x > 74) break;
Drow_Frame(temp->character, 0x71, x, y);
x++;
}
}
//현재 위치로 부터 화면 처음까지 문자 출력
void last_print_char(char x, char y)
{
char_tag* temp;
move_cursor(0, x, y);
for(temp = now_cur; 1 ; temp = temp->prev)
{
x--;
if(x < 4) break;
Drow_Frame(temp->character, 0x71, x, y);
}
}
File : Help_Popup.c - 도움말창 그리기
#include"oneEdit.h"
// 도움말 창 그리기
void Drow_help(void)
{
char x = 10;
char y = 5;
char Sch[50];
Drow_Frame(TOP_L, EX_color, x, y);
for(x = 11; x < 69; ++x)
{
Drow_Frame(WIDTH, EX_color, x, y);
}
Drow_Frame(TOP_R, EX_color, x, y);
x = 10;
y = 6;
Drow_Frame(HEIGHT, EX_color, x, y);
x++;
Drow_Null(' ',H_L_color, x, y, 25);
x = 25;
strcpy(Sch, "**** Help Menu ****");
x = String_print(Sch, x, y, 4, 14);
Drow_Null(' ',H_L_color, x, y, 69);
x = 69;
Drow_Frame(HEIGHT, EX_color, x, y);
x = 10;
y = 7;
Drow_help_middle("F10 - Menu", x, y, 0, 3);
y++;
Drow_help_middle("END - Cursor Point Line End", x, y, 0, 3);
y++;
Drow_help_middle("HOME - Cursor Point Line Home", x, y, 0, 4);
y++;
Drow_help_middle("DELETE - Cursor next character delete", x, y, 0, 6);
y++;
Drow_help_middle("INSERT - Insert next text character", x, y, 0, 6);
y++;
Drow_help_middle("Alt+N - Creat New File", x, y, 0, 5);
y++;
Drow_help_middle("Alt+L - Data File Load", x, y, 0, 5);
y++;
Drow_help_middle("Alt+S - Data File Save", x, y, 0, 5);
y++;
Drow_help_middle("Alt+A - Save for Another File", x, y, 0, 5);
y++;
Drow_help_middle("Alt+E - Exit Programe", x, y, 0, 5);
y++;
Drow_help_middle(" ", x, y, 0, 0);
y++;
Drow_help_middle("ESC - Cancle This Oder", x, y, 0, 3);
y++;
x = 10;
Drow_Frame(LOW_L, EX_color, x, y);
for(x = 11; x < 69; ++x)
{
Drow_Frame(WIDTH, EX_color, x, y);
}
Drow_Frame(LOW_R, EX_color, x, y);
return;
}
//도움말 글들을 반복 그리기 위한 함수
void Drow_help_middle(char *print_string, char x, char y, char first, char last)
{
char Sch[50];
Drow_Frame(HEIGHT, EX_color, x, y);
x++;
Drow_Null(' ',H_L_color, x, y, 20);
x = 20;
strcpy(Sch, print_string);
x = String_print(Sch, x, y, first, last);
Drow_Null(' ',H_L_color, x, y, 69);
x = 69;
Drow_Frame(HEIGHT, EX_color, x, y);
}
File : Other_Drow.c - 반복되는 그리기를 위한 함수들
#include"oneEdit.h"
//글자에 액센트를 주어 화면에 출력함
char String_print(char* Sch, char x, char y, char effect, char last_e)
{
char i;
char attr = H_L_color;
char far *location;
for(i = 0; NULL != Sch[i] ; ++i)
{
if(effect <= i && last_e >= i){
attr = 0x74;
location = RAMADD + y*160 + x*2;
*location++ = Sch[i];
*location = attr;
x++;
attr = H_L_color;
}
else
{
location = RAMADD + y*160 + x*2;
*location++ = Sch[i];
*location = attr;
x++;
}
}
return x;
}
//메세지를 출력하기 위한 팝업박스 그리기
void popup_window(char *print_string, char first, char last)
{
char x = 10;
char y = 10;
char Sch[50];
Drow_Frame(TOP_L, EX_color, x, y);
for(x = 11; x < 69; ++x)
{
Drow_Frame(WIDTH, EX_color, x, y);
}
Drow_Frame(TOP_R, EX_color, x, y);
x = 10;
y = 11;
Drow_Frame(HEIGHT, EX_color, x, y);
x++;
Drow_Null(' ',H_L_color, x, y, 20);
x = 20;
strcpy(Sch, print_string);
x = String_print(Sch, x, y, first, last);
Drow_Null(' ',H_L_color, x, y, 69);
x = 69;
Drow_Frame(HEIGHT, EX_color, x, y);
x = 10;
y = 12;
Drow_Frame(LOW_L, EX_color, x, y);
for(x = 11; x < 69; ++x)
{
Drow_Frame(WIDTH, EX_color, x, y);
}
Drow_Frame(LOW_R, EX_color, x, y);
return;
}
//파일이름 출력
void Drow_Filename(char *Filename)
{
char Sch[20];
char x;
strcpy(Sch, "FileName is [");
x = String_print(Sch, 25, 5, 0, 8);
strcpy(Sch, Filename);
x = String_print(Sch, x, 5, 0, -1);
strcpy(Sch, "]");
x = String_print(Sch, x, 5, 0, -1);
}
'C Programming' 카테고리의 다른 글
| 원라인 에디터 수정 완성본!!ㅋㄷ (1) | 2009/06/04 |
|---|---|
| OneLineEditer Program (Project) (0) | 2009/05/22 |
| [리눅스]도서관리 Chapter2 소스 (0) | 2009/05/22 |
| [리눅스]도서관리 Chapter2 조건문제 (0) | 2009/05/22 |
| [리눅스]도서관리 Chapter 1 (0) | 2009/05/22 |
| [리눅스](기초STEP5) 저수준 파일 입출력으로 데이터 파일로 저장 (0) | 2009/05/15 |


ONELINE.EXE
