/* 사용자가 라이브러리를 사용하기 위해 필요한 header.
   Copyright (C) 2002, 2003, 2004 HRE 개발자 그룹

This file is part of Hangul Regular Expression Library (aka HRE).

HRE is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

HRE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

#ifndef HRE_H
#define HRE_H

#define HDFA_RE(DFA)		((DFA)->re)
#define HDFA_TABLE(DFA)		((DFA)->table)
#define HDFA_TABLE_N(DFA, N)	((DFA)->table[(N)])
#define HDFA_INDEX(DFA)		((DFA)->tindex)
/* 사용자가 입력한 한글 type 에 대한 mask 를 여기에 기록하게 되는데,
   이것이 필요한 이유는 hre_search () 함수를 통해서 검색을 하게 될 때,  
   한글 코드값의 모호성 (http://hre.kldp.net 홈페이지 참조.) 으로 인해 정확한 
   DFA 테이블을 생성했음에도 불구하고 잘못된 코드를 찾기 때문에 추가되었다.
   사용자가 입력한 정규식에 완성형, 유니코드, 조합형이 들어갔을 경우 그에 대한
   mask 값을 가진다. */
#define HDFA_HTMASK(DFA)	((DFA)->htmask)
#define HDFA_IS_SSAC(DFA)	((DFA)->is_ssac)
#define HDFA_RE_FAILED(DFA)	((DFA)->re_failed)
#define HDFA_ERRNO(DFA)		((DFA)->errno)

/* 현재 v0.9 버전에서 지원하고 있는 정규 표현식의 내용으로 조합형, 완성형,
   유니코드를 가지고 있다.  (완성형과 조합형은 거의 분관을 할 수 없으므로
   확장 완성형과 유니코드를 지원한다는 말이 정확할 것이다.)  */
#define HTMASK_JOHAB		0x1
#define HTMASK_EUC_KR		0x2
#define HTMASK_UTF_8		0x4

/* 전체 DFA 테이블을 표현하는 구조체.  모든 정보가 여기에 존재해야
   한다.  */
struct hdfa
{
  int ** table;			/* 전체 DFA 테이블에 대한 주소 */
  char *re;			/* 사용자가 입력한 정규 표현식 문자열 */
  int tindex;			/* 전체 DFA 테이블의 index 번호 */

  /* 사용자가 입력한 한글의 type 에 대한 mask 를 여기에 기록한다.  */
  int htmask;
  int is_ssac;

  /* 사용자가 입력한 정규 표현식을 hre_parser 에서 해석하는 과정에서
     오류가 발생했을 경우, 여기에 설정되게 된다.  */
  int errno;

  /* 사용자가 입력한 정규 표현식이 비록 정규식에서는 오류가 없으나, 실제
     찾을 수 없을 경우 이것이 1 로 설정된다.  */
  int re_failed;
};

/* 정규 표현식의 mode 에 대해서.  */
#define HRE_MODE_BRE		0x1
#define HRE_MODE_ERE		0x2

#define HRE_OPTIONS_MODE(OPT)	((OPT)->mode)

/* 사용자가 정규 표현식을 컴파일할 때, 정의할 수 있는 옵션 내용을 가지고
   있다.  */
struct hre_options
{
  int mode;

  /* 정의된 것이 없음. */
};

/* 정규 표현식의 type.
   이것은 사용자가 입력한 정규 표현식이 완전히 해석된 후 만들어진 DFA
   테이블을 가지고 있다.  */
typedef struct hdfa * hre_t;
/* 정규 표현식의 해석을 요구할 때 사용할 수 있는 옵션들.  */
typedef struct hre_options hre_option_t;

extern hre_t hre_compile (char *, struct hre_options *);
extern int hre_search (hre_t, const char *);
extern void hre_free (hre_t);

#endif
