#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <ctype.h>

#ifndef	SJIS
#  ifndef	EUC
#    define	SJIS
#  endif
#endif	/* SJIS */

#ifdef	MSDOS
#  ifndef	FMRBIOS
#    ifndef	    MSCDEX
#        define		FMRBIOS
#    endif
#  endif
#endif	/* MSDOS */

#ifdef	MSDOS
#include    <stdlib.h>
#  ifdef	TC
#    include    <alloc.h>
#  else
#    include    <malloc.h>
#  endif
#include    <jctype.h>
#include    <dos.h>
#endif	/* MSDOS */

#ifdef	UNIX

#include    <curses.h>
#ifdef	NEWS
#include    <locale.h>
#endif

#ifndef	MORE
#define	MORE	"more"
#endif

#ifndef	CD_ROM
#define	CD_ROM	"/dev/Cdrom"
#endif

#ifdef	iskanji
#  undef	iskanji
#  undef	iskanji2
#endif

#ifdef	EUC
#define	iskanji(c)	((c) & 0x80)
#define	iskanji2(c)	((c) & 0x80)
#endif	/* EUC */

#ifdef	SJIS
#define	iskanji(c)	(((c) >= 0x80 && (c) <= 0x9F) ||\
			 ((c) >= 0xE0 && (c) <= 0xFE))
#define	iskanji2(c)	(((c) >= 0x30 && (c) <= 0x7E) ||\
			 ((c) >= 0x80 && (c) <= 0xFE))
#endif	/* SJIS */

#endif	/* UNIX */

#ifdef	ERR
#undef	ERR
#endif

#ifdef	FALSE
#undef	FALSE
#endif

#ifdef	TRUE
#undef	TRUE
#endif

#define	ERR	(-1)
#define	FALSE	0
#define	TRUE	1

#define	HONBUN_MAX_LINE	1000
#define	MENU_CHK_LINE	30

#define	BLOCK_SIZE	2048
#define	INDEX_MAX	127

#ifdef	UNIX
#define	COLS_MAX	256
#define	LINE_MAX	128
#else
#define	COLS_MAX	160
#define	LINE_MAX	64
#endif

#ifdef	UNIX
#define	FAR	
#define	MALLOC		malloc
#define	FREE		free
#define	FAR_MEMCPY	memcpy
#define	NEAR_MEMCPY	memcpy
#define	FAR_STRCPY	strcpy
#define	NEAR_STRCPY	strcpy
#endif	/* UNIX */

#ifdef	MSDOS
#define	FAR		far
#  ifdef MSC
#    define	MALLOC		_fmalloc
#    define	FREE		_ffree
#  else
#    define	MALLOC		farmalloc
#    define	FREE		farfree
#  endif
#endif	/* MSDOS */

#define	DEF_COLS_MAX	80
#define	DEF_LINE_MAX	24

#define	MENU_MAX	128
#define	BETU_MAX	10

#define	KEY_NULL	(-1)
#define	KEY_KANA	0
#define	KEY_HYOKI	1
#define	KEY_ALPHA	2
#define	KEY_KANJI	3
#define	KEY_NUMBER	4

#define	CH_BOLD_ON	1
#define	CH_BOLD_OFF	2
#define	CH_ITALIC_ON	3
#define	CH_ITALIC_OFF	4

#define	DIC_FILE_MODE	0
#define	DIC_DEVICE_MODE	1

#define	zentohan	zen2han
#define	hantozen	han2zen

#define	IDX_MAX		15
#define	IDX_KANA	(index_tab[0].ip)
#define	IDX_ALPHA	(index_tab[1].ip)
#define	IDX_KANJI	(index_tab[2].ip)
#define	IDX_HYOKI	(index_tab[3].ip)
#define	IDX_KKANA	(index_tab[4].ip)
#define	IDX_KHYOKI	(index_tab[5].ip)
#define	IDX_KALPHA	(index_tab[6].ip)
#define	IDX_TANGO	(index_tab[7].ip)
#define	IDX_CROSS	(index_tab[8].ip)
#define	IDX_ZKANA	(index_tab[9].ip)
#define	IDX_ZHYOKI	(index_tab[10].ip)
#define	IDX_ZALPHA	(index_tab[11].ip)
#define	IDX_NUMBER	(index_tab[12].ip)
#define	IDX_MENU	(index_tab[13].ip)
#define	IDX_COPR	(index_tab[14].ip)

typedef	unsigned char	uchar;
typedef	unsigned short	ushort;
typedef	unsigned int	uint;
typedef	unsigned long	ulong;

typedef	struct {
	uchar		id;
	uchar		type[3];
	ulong		start_block;
	ulong		block_max;
} INDEX;

typedef	struct	{
	uchar	id;
	INDEX	*ip;
} INDTAB;

typedef	struct {
	ulong		block;
	ushort		offset;
} POINT;

typedef	struct _MULPTR {
	struct _MULPTR	*next;
	int		bs, mx;
	char		mul_ttl[1];
} MULPTR;

typedef	struct _MULTI {
	struct _MULTI	*next;
	struct _MULPTR	*mul_list;
} MULTI;

typedef	struct _CAT {
	struct _CAT	*next;
	char		*ttl;
	int		no;
	int		gaz, gah;
} CATALOG;

typedef	struct _DM {
	struct _DM	*next;
	int		mode;
	char		*file;
	char		*ttl;
	int		no;
	int		gaz, gah;
} MENU;

typedef	struct _MENUPTR {
	struct _MENUPTR	*next;
	int		sx, sy;
	int		bx, by;
	POINT		pos;
} MENUPTR;

/*****************************************************

	Data Defs

/*****************************************************/
/*	main.c	*/
extern	char	*program_name;

extern	int	all_index_disp;
extern	int	src_index_disp;

extern	int	lines_max;
extern	int	cols_max;
extern	int	towns_flg;

extern	char	*dict_file_name;
extern	FILE	*dev_fp;
extern	FILE	*ext_out_fp;
extern	char	ext_out_file[128];

extern	char	*dev_unit_name;

#ifndef	STDFILE
extern	int	dev_unit_no;
#endif

extern	char	*select_dic_str;
extern	int	now_dic_mode;
extern	int	now_dev_id;
extern	MENU	*dic_menu;
extern	MENU	*now_dic_menu;
extern	int	dic_count;

extern	int	pause_flg;
extern	int	prompt_flg;
extern	int	zenkou_flag;
extern	int	cutof_flag;
extern	int	gaiji_flag;
extern	int	color_flag;
extern	int	bitmap_flag;
extern	int	extdisp_flag;
extern	int	extinput_flag;
extern	int	copr_disp_flg;
extern	int	menu_disp_flg;
extern	int	tex_out_flag;

/*	dic.c	*/
extern	MULTI	*multi_top;

extern	int	index_tab_base;
extern	int	index_tab_max;

extern	INDEX	*index_ptr;
extern	int	index_max;
extern	int	index_total;
extern	INDEX	index_buf[INDEX_MAX];
extern	INDTAB	index_tab[];

extern	POINT	title;
extern	POINT	honbun;

/*	dicget.c	*/
extern	int	menu_max;
extern	int	betu_max;
extern	MENUPTR *menu_top;
extern	MENUPTR	*betu_top;
extern	MENUPTR	menu_tab[MENU_MAX];
extern	MENUPTR	betu_tab[BETU_MAX];

/*	cdio.c	*/
extern	ulong	vtoc_start_block;
extern	ulong	vtoc_end_block;
extern	int	vtoc_file_max;

extern	char	file_name[48];
extern	ulong	file_start_block;
extern	ulong	file_end_block;

extern	uchar	dic_buf[BLOCK_SIZE];

extern	int	comp_dic_mode;

/*	gaiji.c	*/
extern	int	dicin_gaiji_flag;
extern	ulong	zen_gaiji_start_block;
extern	ulong	zen_gaiji_end_block;
extern	ulong	han_gaiji_start_block;
extern	ulong	han_gaiji_end_block;
extern	char	*gaiji_map_file;

/*****************************************************

	Func Defs

/*****************************************************/
/*	lib.c	*/
int	toshort(uchar *p);
long	tolong(uchar *p);
int	iszero(uchar *p, int len);
int	htoi(char *p);
int	sjistojis(int cd);
int     jistosjis(int cd);
#ifdef	EUC
int	jistoeuc(int ch);
#endif
int	hantozen(int code);
int	zentohan(int ch);
void	str_cnv(uchar *buf, uchar *str, int len);
void	put_jis(uchar *str, int len);
uchar	*str_jis(uchar *buf, uchar *str);
uchar	*str_word(uchar *buf, uchar *str);
char	*strlow(char *str);
char	*skipspc(char *str);
char	*skipword(char *str);
int	strcut(int max, char *av[], char *str);
#ifdef	LSIC
char	*strdup(char *str);
#endif
char	*gobi_conv();
int	gobi_init(uchar *str);

/*	cdio.c	*/
int	CD_mode_set(int mode);
int	CD_read_sect(ulong sect, int count, char *buff);
int	CD_read_time(int min, int sec, int blk, int count, char *buff);
int	CD_file_init();
int	CD_file_open(int no);

int	IO_block_read(ulong block);
int	IO_seek(ulong block, ushort offset);
int	IO_getc();
int	IO_read(char *buf, int size);

int	Cache_init();
int	Cache_flush(int id);
char	*id_to_name(int id);
int	name_to_id(char *name);

/*	gaiji.c	*/
void	Gaiji_tab_init();
void	Gaiji_init(int zen, int han);
void	Gaiji_close();
uchar	*Gaiji_convert(uint *extc);
int	Gaiji_config(char *file);
int	Gaiji_maping(int code, char *str);
int	Gaiji_display(ushort extc);
void	Gaiji_zenkaku_bitmap();
void	Gaiji_hankaku_bitmap();

/*	scrn.c	*/
int	dic_display(ulong block, ushort offset);
void	pager(POINT *tab, int max, int fg);
int	more(POINT *tab, int max);

/*	dic.c	*/
int	init_serch(char *str);
int	dic_serch();
void	index_tab_init(int bs, int mx);
int	dic_open();

/*	dicget.c	*/
int	cd_get_data();
char	*cd_gets(char *buf, int max, int line);
int	dic_seek(ulong block, ushort offset);

/*	diclib.c	*/
char	*idx_name(INDEX *ip);
int	dic_kensaku(uchar *str);
void	dic_print(int mx);

void	dic_index_print();
void	dic_index_list();
void	multi_index_print(MULPTR *mp);
void	multi_dic_print(MULTI *mul);
int	multi_select(int no);

/*	catalog.c	*/
CATALOG	*catalog_load(char *file);
void	catalog_free(CATALOG *cp);

/*	cmds.c	*/
int	command(char *cmd);

#ifdef	HISTORY
/*	his.c	*/
char    *input(char *buf, int max);
#endif

#ifdef	MKDIC
int	compress(int flag, char *file);
#endif

/*	main.c	*/
int	main_device_open(int mode, char *file);
int	main_dic_open(MENU *mp);
int	main_menu_set(int mode, char *file,
		char *ttl, int no, int gah, int gaz);
int	main_catalog_set(char *file, int no);
int	main_dic_list();
int	main_dic_select(int no, char *str);

/*	select.c	*/
int	device_config(char *file);
