태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바


*****실행파일*****

수정한 부분
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);
}

Posted by 쏠쓰

트랙백 주소 :: http://solosols.tistory.com/trackback/58 관련글 쓰기