/* hangul.h */

#ifndef _HANGUL_H
#define _HANGUL_H

#include <stdio.h>
#include "convert.h"

#ifdef __cplusplus
extern "C" {
#endif

#undef TRUE 
#define TRUE 				1
#undef FALSE
#define FALSE 				0

#define IS_LOW_ASC			0	/* 127 이하인 아스키 코드      */ 
#define IS_HIGH_ASC 		1	/* 128 이상인 아스키 코드      */ 
#define IS_ENGLISH			0	/* 현 바이트가 영문코드        */
#define IS_HANGUL_FIRST  	1	/* 현 바이트가 한글의 첫째코드 */
#define IS_HANGUL_SECOND 	2	/* 현 바이트가 한글의 둘째코드 */

#define HAN_ENG_MODE 		0	/* 한글영문 입력토글 배열첨자 */
#define HAN_KEYBOARD 		1	/* 두벌-세벌식 상태 배열첨자 */
#define HAN_CODE 			2	/* 조합-완성 입력상태 배열첨자 */

#define ENG_INPUT 			0	/* 지금은 영문입력중 */
#define HAN_INPUT 			1	/* 한글입력중 */ 
#define DUBEL_TYPE 			0	/* 두벌식 */
#define SEBEL_TYPE 			1	/* 세벌식 */
#define KS5061_CODE 		0	/* 완성형 */
#define JOHAP_CODE 			1	/* 조합형 */

/* 한글판별루틴에서 사용하는 매크로 정의 */
#define CODE_ENGLISH 		0	/* 결과가 영문코드 */
#define CODE_KS5061 		1	/* 완성형 코드 */
#define CODE_JOHAP 			2	/* 조합형 코드 */

/* Hangul Automata buffer structure */
struct inStack {
  int currentHanState;
  int key;
  int unionCode;
};

/* Variable about hangul Automata */
extern struct inStack inStack[];
extern int outStack[];
extern int inSP;
extern int outSP;
extern int tempHanState;

/* hangul or english, keyboard type, ks5601 or Johap code */
extern int hanMode[];

#define hanAutomata(x) (hanMode[HAN_KEYBOARD]?hanAutomata3(x):hanAutomata2(x))
#define hgetkey(x)     (hanMode[HAN_KEYBOARD]?hgetkey3(x):hgetkey2(x))

/* hangul input functions */
int hanAutomata2(int key);
int hanAutomata3(int key);

int hgetkey2(int *key);
int hgetkey3(int *key);

/* hangul etc functions */
int ishangul(unsigned char *str, int index);

#ifdef __cplusplus
}
#endif

#endif  /* hangul.h */
