/*
 *  TEX Device Driver  ver 2.02-
 *  copyright(c) 1988, 1989 by TSG, 1990-1993 by SHIMA
 *  1991 changed by hideki
 *  1991 changed by T.Minagawa
 *
 *  init.c : initialize variables
 *      Apr. 29, 1989 : 1st edition
 *      Jun.  1, 1989 : 2nd edition
 *
 *      March, 1990   : Modified by SHIMA
 *  This module is a device-dependent one.
 *
 *	modified for non PC-9801 machines by sempa 1992
 *             14 June 1992 : modified for tpic by Oh-Yeah?
 *  modified for Hires-9801 by OkI 21 June 1992
 *  modified for pTeX `tate' mode,  6 August 1992  by Naochan!.
 *  slightly modified for pTeX on LIPS3 by OkI 8 August 1992
 *	modified for "-wait" option by sempa, 1 Sept 1992
 *  slightly modified for NTTjTeX by Yakumo, Nov. 1992
 *  modified for NTTjTeX by Yakumo 16 Dec. 1992
 *  modified for EMS by SHIMA, Dec. 1992
 *  modified for DOS/V hero.h, Jan. 1993
 */

/*
#define	DEBUG1	1
*/

#define	MAX_VIEW	16
#define	USER_EMS_PAGES	4

#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <mem.h>
#include <alloc.h>
#include <string.h>
#include <ctype.h>
#include <io.h>	/* H.senshu */

#define _DEF_STDIO_H_
#include "dd.h"
#include "err.h"
#include "dviread.h"
#include "device.h"

#if defined(DOSV)
#include "dev_dosv.h"
#endif

#if defined(J3100)
#include "dev_j31.h"
#endif

#include "option.h"
#include "version.h"
#include "vfont.h"

extern long view_buf_size;

void get_config(int, char **);
void initialize(DVIFILE_INFO *, DIMENSION *);

static void read_post(DVIFILE_INFO *);
static void pixel_init(DVIFILE_INFO *, DIMENSION *);

/* static void set_mag( DIMENSION* ); */
static void set_dimension(DVIFILE_INFO *, DIMENSION *);
static void make_page_index(DVIFILE_INFO *, DIMENSION *);
static ulong mult_long(ulong, ulong);
static void opt_cfg(char *);
static void youshi_size(char *);

ulong leftbuffer(void);

/* option.c */
void set_option(ARG_TABLE *, int, char **);
void set_config(ARG_TABLE *, char *);
int make_path(char *path, char *dir, char *name, char *ext);

/* size.c */
void set_convert(SIZE_PARA, int, int);
PIXEL sptopixel(SCALED_PT);
PIXEL vtopixel(SCALED_PT);

int set_size(PIXEL, PIXEL, PIXEL, PIXEL, PIXEL *, PIXEL *);

/* fontdef.c */
void make_font_list(DVIFILE_INFO *, DIMENSION *);

/* buffer.c */
void buffer_init(void);
ulong leftbuffer(void);
char *marea(int);

/* decodepk.c */
void decode_init(void);

/* mult20.asm */
ulong mult20(ulong, ulong);

/* stack.c */
void stack_init(int stack_max);

#ifndef NOTPIC
/* tpic.c */
void tpic_init(PIXEL buf_height);	/* alloc y-bucket[vmax] and activate */

#endif

/* vfont.c */
int get_vfont_name(char *);

/* dev*.c */
void set_disp_reso(void);

/* vfont.c escpage.c 疑似縦書きスイッチ Tomiie*/
#ifndef	NOTATEGAKI
int tategaki = 0;

#endif

#ifndef NO_NTTRPL
/* NTTjTeX->ASCII日本語TeX font変換フラグ */
BOOL ntt_subst;
char *ntt_subst_fonts;

#endif

int test_flg = -1;

/* -f があるかどうか */
static BOOL mag_half = FALSE;

/* -half があるかどうか */
static int opt_mag = -1;

/* -mag によって指定された数 */
BOOL dvifile_page = FALSE;

static BOOL f_rotate = FALSE;

int enlarge;
static BOOL enlarge_len;
static int add_width;
static int add_height;
static int f_center;
static int v_dx;
static int v_dy;

/* by K.Yoshizawa  Dec. 26, 1992 */
#ifdef	NNSZ
BOOL f_use_new_size_option = FALSE;
#else
BOOL f_use_new_size_option = TRUE;
#endif

/* A4 :  210mm x 297mm */
static SCALED_PT PW = MM_TO_SP(210);	/* 用紙の横幅 */
static SCALED_PT PH = MM_TO_SP(297);	/* 用紙の縦幅 */
static SCALED_PT TM;	/* 用紙上端部のマージン */
static SCALED_PT BM;	/* 用紙下端部のマージン */
static SCALED_PT LM;	/* 用紙左端部のマージン */
static SCALED_PT RM;	/* 用紙右端部のマージン */
static SCALED_PT MW;	/* 印字可能域の最大横幅 */
static SCALED_PT MH;	/* 印字可能域の最大縦幅 */
static SCALED_PT OX;	/* 横方向の移動 */
static SCALED_PT OY;	/* 縦方向の移動 */
/* by K.Yoshizawa  Dec. 27, 1992 */
static BOOL HC = FALSE;	/* 水平センタリング */
static BOOL VC = FALSE;	/* 垂直センタリング */
static SCALED_PT HS;	/* 水平センタリング後の移動 */
static SCALED_PT VS;	/* 垂直センタリング後の移動 */

int slow_fact = 0;
int slow_fact2 = 0;
int v_shift0;
int slow_page;
int org_mag;

BOOL f_reverse = FALSE;

#if defined(PC9801) || defined(DOSV) || defined(J3100)
static char *colorbuf = NULL;
static uint atoh(char *pt);

#endif

#ifdef PC9801
BOOL normal_16color = FALSE;
uint fore_color = 0;
uint back_color = 0x888;

#endif

BOOL f_max_bb;
char *resume_file;

#ifndef NOTPIC
int f_tpic_turn_on = 1;	/* default is on */

#endif

#ifndef NOPS
extern int f_GS;
extern BOOL f_gbox;
extern char *gs_exe;
extern char *pbm_path;
extern BOOL f_gsize;
#ifdef	GIF
extern BOOL f_GIF;

#endif
#endif

#ifdef HIRES98
int hireso = 0;	/* 0: normal, 1: high&interlace, 2: high & noninterlace */
#endif

#ifdef DOSV
extern BOOL f_soft_scroll;
extern int video_chip;

#endif

#if defined(DOSV) || defined(J3100)
extern BOOL f_ramdac;
extern struct PALETTE s_color;
extern int disp_reso;

#endif

#ifndef	NEMS
static int user_ems = USER_EMS_PAGES;

#endif

#define	CFG_PATH	"TEXCFG"

char progname[9]     = "dviout";		/* program name */
char config_name[13];					/* config file name */

 /* name of the env-variable for pk-font path */
const char *const pk_env_name = "TEXPK";

const char *const title_name =
"TeX DVI PREVIEWER "
MACHINE VERSION;

const char *const title_copyright =
"\nCopyright(C) 1988-89 by TSG, 90-93 by SHIMA,"
#ifdef VFD
"\n\t     1991-93 changed by Akiii, hero.h, hideki, Naochan!, Oh-Yeah?, OkI,"
"\n\t\t     SOLITON, "
#else
"\n\t     1991-93 changed by Akiii, hero.h, Naochan!, Oh-Yeah?, OkI, SOLITON"
"\n\t\t     "
#endif
"sempa, T.Minagawa, Tomiie, "
#ifndef NOPS
"T.Uchiyama, "
#endif
"Yakumo, Yoshizawa";

/* vector font config file name */

extern char prt_type;
extern BOOL f_long_name;
extern BOOL f_font_c;
extern char *goth;
extern char *sub_font;
extern char *fc_name;
extern char *k_dbl;
extern char *k_16;
extern int num_view;
extern int k_scale;
extern int k_base;
extern int x_shift;
extern int y_shift;
extern int s_max_width;
extern int s_max_height;
extern int f_machine_unique;
extern int f_search;
extern int f_EMS_pages;
extern int view_EMS_unit;
extern int total_EMS_page;
extern BOOL f_wait;
extern BOOL use_lateral_kanji;
extern BOOL f_resize;

#ifdef VFD
extern BOOL tatevfd;

#endif

/* using lateral Kanji Font for vertical writing (pTeX)
     */
extern BOOL draw_baseline;

/* draw the baseline.
     */
extern BOOL draw_boxpic;

/* typesetting with blank boxes (instead of normal characters.)
     */

void set_trans_jis(char *);
void use_romfont(char *);

extern char ptex_mode;

/* when `extended dvi file' encountered, this value is not zero.(pTeX)
     */

#ifndef	NOVFONT
extern int f_use_vfont;
static char *vfont_name;
#endif

#define	FAR_HEAP	0L
#define	BUFFER_NUM	4
#define	CHAR_LIM	(0xff00/sizeof(PREAMBLE))

BUF_INFO buffers[BUFFER_NUM] =
{
	{NULL, NULL, NULL, DEF_RASTER_SIZE, f_HUGE, -1, 0, 0, NULL, NULL},
	{NULL, NULL, NULL, DEF_PK_SIZE, f_HUGE, -1, 0, 0, NULL, NULL},
	{NULL, NULL, NULL, DEF_BITMAP_SIZE, f_HUGE, -1, 0, 0, NULL, NULL},
	{NULL, NULL, NULL, DEF_WORK_SIZE, f_HUGE, -1, 0, 0, NULL, NULL}
};

FONT_INFO *first_font_info = NULL;
FONT_INFO *font_info_root = NULL;

/*
BUF_INFO *raster_buf_pointer = &buffers[0];
BUF_INFO *pk_buf_pointer = &buffers[1];
BUF_INFO *bitmap_buf_pointer = &buffers[2];
*/

DIMENSION dviout_dimension =
{
	CRT_DPI,	/* dpi */
	0, /* DPI */
	CRT_WIDTH, CRT_HEIGHT,	/* device width, height */
	CRT_WIDTH, CRT_HEIGHT,	/* output width, height */
	0, 0,	/* buffer width, height */
	0, 0,	/* text width, height */
	DEF_MAG,	/* mag */
	0, /* split */
	DEF_PRINT_DIR,	/* print direction */
	0.0,	/* convert parameter */
	0, 0,	/* x-offset, y-offset */
	0, /* offset of the page */
	0, /* total page */
	0, 0,	/* start page, end page */
	0x80	/* device type */
};

static ARG_TABLE option[] =
{
#ifdef	JAPANESE
	{"mag", INTEGER, (void *)&opt_mag,
	 "mag step(0-9), mag(500-)"},
	{"half", BOOLEAN, (void *)&mag_half,
	 "\x09" "half)"},
	{"br", LONGINT, (void *)&(buffers[0].size),
	 "展開フォント     バッファサイズ(byte単位)"},
	{"bf", LONGINT, (void *)&(buffers[1].size),
	 "フォントファイル" AsAbove},
	{"bb", LONGINT, (void *)&(buffers[2].size),
	 "展開ビットマップ" AsAbove},
	{"bw", LONGINT, (void *)&(buffers[3].size),
	 "ワーク用        " AsAbove},
	{"bv", INTEGER, (void *)&num_view,
#ifndef	NEMS
	 "イメージ表\示での保存ページ数(EMSのときは負数)"},
	{"EMS", INTEGER, (void *)&f_EMS_pages,
	 "EMSの使用ページ数(デフォルト 全部)"},
#else
	 "イメージ表\示での保存ページ数"},
#endif
	{"f", INTEGER, (void *)&test_flg,
	 "情報表\示(0-3)"},
	{"wait", BOOLEAN, (void *)&f_wait,
	 "エラー時にキー入力を待つ"},
	{"dpi", INTEGER, (void *)&(dviout_dimension.dpi),
	 "dpi設定"},
	{"DPI", INTEGER, (void *)&(dviout_dimension.DPI),
	 "\x03" "(縦方向)"},
	{"e", INTEGER, (void *)&(enlarge),
	 "拡大率(1000倍)"},
	{"page", BOOLEAN, (void *)&dvifile_page,
	 "オフセットページ指定"},
	{"X", INTEGER, (void *)&(dviout_dimension.x_offset),
	 "横方向位置調整(ドット単位)"},
	{"Y", INTEGER, (void *)&(dviout_dimension.y_offset),
	 "縦" AsAbove},
	{"w", INTEGER, (void *)&add_width,
	 "横方向の幅" AsAbove},
	{"h", INTEGER, (void *)&add_height,
	 "縦" AsAbove},
#ifndef NOTPIC
	{"tpic", INTEGER, (void *)&f_tpic_turn_on,
	 "tpic special[0:ignore 1:Bezier(デフォルト)"
 #ifndef TPIC_NSPL
	 " 2:spline"
 #endif
	 "]"},

#endif
#ifndef NOPS
	{"GS", INTEGER, (void *)&f_GS,
	 "Ghostscript[0:Off 1:On(default) 2:verbose 3:PBM 4:exact PBM 5:gssub]"},
#ifdef	GIF
	{"GIF", BOOLEAN, (void *)&f_GIF,
	 "pbmrawの代わりにgifmonoを使う"},
#endif
	{"gsx", STRING, (void *)&gs_exe,
	 "Ghostscript(デフォルト gs.exe)"},
	{"gdat", STRING, (void *)&pbm_path,
	 "pbm/gifファイルのディレクトリ"},
	{"gbox", BOOLEAN, (void *)&f_gbox,
	 "取り込み画像の枠表示"},
	{"gsize", BOOLEAN, (void *)&f_gsize,
	 "\x0c"      "サイズ:mag込み"},
#endif
#ifdef DOSV
	{"chip", INTEGER, (void *)&video_chip,
	 "ビデオコントローラ[デフォルト 0:VGA]"},
#endif
#if defined(DOSV) || defined(J3100)
	{"reso", INTEGER, (void *)&disp_reso,
	 "表示解像度[デフォルト: 0:640x"
#if defined(DOSV)
	 "480"
#elif defined(J3100)
	 "400, VGA: 1:640x480"
#endif
	 "]"},
#endif
#ifdef DOSV
	{"sws", BOOLEAN, (void *)&f_soft_scroll,
	 "ソフトウェアスクロールを使用"},
#endif
	{"u", INTEGER, (void *)&slow_page,
	 "ページの切り替え・スピード(0,1,2,...)"},
	{"s", INTEGER, (void *)&slow_fact,
	 "半画面スクロール" AsAbove},
	{"sh", INTEGER, (void *)&slow_fact2,
	 "横方向" AsAbove},
	{"t", INTEGER, (void *)&v_shift0,
	 "縦方向スクロール・スピード(-16,-15,..,0,1,2,...)"},
#ifdef VFD
	{"RV", BOOLEAN, (void *)&tatevfd,
	 "vfdフォントの回転"},
#endif

/*デバッグ用・・・NTTjTeXでの簡易縦書きプレビュー用に復活 by Yakumo */
#ifndef	NOTATEGAKI
	{"RR", HIDDEN_BOOLEAN, (void *)&tategaki,
	 " 書体倶楽部のフォントを90度回転"},
#endif /**/
#if defined(PC9801) || defined(DOSV) || defined(J3100)
	{"R", STRING, (void *)&colorbuf,
	 "表示カラー変更(<RGBrgb>デフォルト白黒反転)"},
#endif
	{"B", STRING, (void *)&resume_file,
	 "ページ・レジューム"},
	{"r", STRING, (void *)&fc_name,
	 "フォントキャッシュのセーブ"},
	{"L", BOOLEAN, (void *)&f_long_name,
	 "長いフォント名の中央省略"},
	{"c", BOOLEAN, (void *)&f_font_c,
	 "フォントの整合性チェック"},
	{"F", STRING, (void *)&sub_font,
	 "代替フォント指定"},
	{"A", INTEGER, (void *)&f_search,
	 "フォントサーチ範囲拡大"},
	{"K", STRING, (void *)&k_dbl,
	 "倍角漢字指定"},
	{"G", STRING, (void *)&goth,
	 "ゴシック漢字指定"},
	{"g", BOOLEAN, (void *)&use_lateral_kanji,
	 "横書き用漢字フォントを使用(pTeX縦書きモード)"},
	{"JC", PROCEDURE, (void *)set_trans_jis,
	 "JIS文字コード変換"},
	{"romf", PROCEDURE, (void *)use_romfont,
	 "内蔵漢字フォントを使用するドット数(<max>[:<min>])"},
	{"k", STRING, (void *)&k_16,
	 "-romf= から除くドット数(<dot>:<dot>:...)"},
	{"varf", BOOLEAN, (void *)&f_resize,
	 "フォントをスケーラブルにする"},
	{"base", BOOLEAN, (void *)&draw_baseline,
	 "ベースラインを引く"},
	{"box", BOOLEAN, (void *)&draw_boxpic,
	 "文字の代わりに箱で組版"},
#ifndef	NOVFONT
	{"vfn", STRING, (void *)&vfont_name,
	 "書体倶楽部フォント"},
#endif
#ifndef NO_NTTRPL
	{"nttF", STRING, (void *)&ntt_subst_fonts,
	 "NTTjTeXでの非標準和文フォントの代替フォント指定"},
	{"ntt", BOOLEAN, (void *)&ntt_subst,
	 "\x07" "の和文フォントをアスキー日本語TeX用フォントで代用"},
#endif
	{"S", INTEGER, (void *)&k_scale,
	 "漢字スケール(1000倍) 標準値 952"},
	{"J", INTEGER, (void *)&k_base,
	 "\x04" "ベースライン(1000倍) 標準値 0"},
	{"W", INTEGER, (void *)&(s_max_width),
	 "Ｖ横幅  (ドット単位)"},
	{"H", INTEGER, (void *)&(s_max_height),
	 "\x02" "縦" AsAbove},
	{"P", INTEGER, (void *)&v_dx,
	 "\x02" "横位置" AsAbove},
	{"Q", INTEGER, (void *)&v_dy,
	 "\x02" "縦" AsAbove},
	{"C", BOOLEAN, (void *)&(f_center),
	 "\x02" "センタリング"},
	{"M", BOOLEAN, (void *)&(f_max_bb),
	 "展開ビットマップを -W, -H で指定したサイズに"},
	{"E", INTEGER, (void *)&f_machine_unique,
#if     defined(PC9801)
	 "終了状況\n"},
#elif	defined(DOSV)
	"画面モード番号\n"},
#elif	defined(J3100)
    "マシンタイプ(0:default, 1:DynaBook V)\n"
}
   ,
#else
	 "未使用\n"},
#endif
#ifndef	NNSZ
 /* by K.Yoshizawa  Dec. 26, 1992 */
	{"newsize", BOOLEAN, (void *)&f_use_new_size_option,
	 "以下のサイズ・オプションを使用"},
	{"PW", LENGTH, (void *)&PW,
	 "用紙の横幅 [デフォルト 210mm(A4)]"},
	{"PH", LENGTH, (void *)&PH,
	 "\x06" "縦幅 [デフォルト 297" AsAbove},
	{"y", PROCEDURE, (void *)youshi_size,
	 "\x06" "選択 [A3|A4|A5|B4|B5|H(葉書)[p|l]]"},
	{"TM", LENGTH, (void *)&TM,
	 "\x04" "上端の印字不可能域の幅"},
	{"BM", LENGTH, (void *)&BM,
	 "\x04" "下" AsAbove},
	{"LM", LENGTH, (void *)&LM,
	 "\x04" "左" AsAbove},
	{"RM", LENGTH, (void *)&RM,
	 "\x04" "右" AsAbove},
	{"MW", LENGTH, (void *)&MW,
	 "印字可能域の最大横幅"},
	{"MH", LENGTH, (void *)&MH,
	 "\x10" "縦" AsAbove},
	{"OX", LENGTH, (void *)&OX,
	 "横方向の移動"},
	{"OY", LENGTH, (void *)&OY,
	 "縦" AsAbove},
 /* by K.Yoshizawa  Dec. 27, 1992 */
	{"V", BOOLEAN, (void *)&(f_rotate),
	 "用紙サイズの縦横を逆にする"},
	{"esize", BOOLEAN, (void *)&enlarge_len, "-e= の影響を受ける"},
	{"HC", BOOLEAN, (void *)&HC, "水平センタリング"},
	{"VC", BOOLEAN, (void *)&VC, "垂直" AsAbove},
	{"HS", LENGTH, (void *)&HS, "水平センタリング後の移動"},
	{"VS", LENGTH, (void *)&VS, "垂直センタリング後の移動\n"},
#endif
	{"=", PROCEDURE, (void *)opt_cfg,
	 "パラメータファイル指定"},
#else
	{"mag", INTEGER, (void *)&opt_mag,
	 "mag step(0-9), mag(500-)"},
	{"half", BOOLEAN, (void *)&mag_half,
	 "\x09" "half)"},
	{"br", LONGINT, (void *)&(buffers[0].size),
	 "raster buffer size"},
	{"bf", LONGINT, (void *)&(buffers[1].size),
	 "font  " AsAbove},
	{"bb", LONGINT, (void *)&(buffers[2].size),
	 "bitmap" AsAbove},
	{"bw", LONGINT, (void *)&(buffers[3].size),
	 "work  " AsAbove},
	{"bv", INTEGER, (void *)&num_view,
#ifndef	NEMS
	 "number of view images to save(negative number to use EMS)"},
	{"EMS", INTEGER, (void *)&f_EMS_pages,
	 "number of pages to use EMS(default all)"},
#else
	 "number of view images to save"},
#endif
	{"f", INTEGER, (void *)&test_flg,
	 "test-flag(0-3)"},
	{"wait", BOOLEAN, (void *)&f_wait,
	 "wait for key-input when error occurs"},
	{"dpi", INTEGER, (void *)&(dviout_dimension.dpi),
	 "reset dpi"},
	{"DPI", INTEGER, (void *)&(dviout_dimension.DPI),
	 "vertical dpi"},
	{"e", INTEGER, (void *)&(enlarge),
	 "enlarge*1000"},
	{"page", BOOLEAN, (void *)&dvifile_page,
	 "pages are dvifile-pages"},
	{"X", INTEGER, (void *)&(dviout_dimension.x_offset),
	 "x-offset  (pixel)"},
	{"Y", INTEGER, (void *)&(dviout_dimension.y_offset),
	 "y" AsAbove},
	{"w", INTEGER, (void *)&add_width,
	 "add width"  AsAbove},
	{"h", INTEGER, (void *)&add_height,
	 "add length" AsAbove},
#ifndef NOTPIC
	{"tpic", INTEGER, (void *)&f_tpic_turn_on,
	 "tpic special[0:ignore 1:Bezier(default)"
 #ifndef TPIC_NSPL
	 " 2:spline"
 #endif
	 "]"},
#endif
#ifndef NOPS
	{"GS", INTEGER, (void *)&f_GS,
	 "Ghostscript[0:Off 1:On(default) 2:verbose 3:PBM 4:exact PBM 5:gssub]"},
#ifdef	GIF
	{"GIF", BOOLEAN, (void *)&f_GIF,
	 "use gifmono in place of pbmraw"},
#endif
	{"gsx", STRING, (void *)&gs_exe,
	 "Ghostscript(default gs.exe)"},
	{"gdat", STRING, (void *)&pbm_path,
	 "Directory of pbm/gif file"},
	{"gbox", BOOLEAN, (void *)&f_gbox,
	 "draw frame for picture"},
	{"gsize", BOOLEAN, (void *)&f_gsize,
	 "picture size:include mag"},
#endif
#if defined(DOSV)
 /* by hero.h Jan, 1993 */
	{"chip", INTEGER, (void *)&video_chip,
	 "video controler (default 0:VGA)"},
#endif
#if defined(DOSV) || defined(J3100)
	{"reso", INTEGER, (void *)&disp_reso,
	 "Display resolution (default 0:640x"
#if defined(DOSV)
	 "480"
#elif defined(J3100)
	 "400, VGA 1:640x480"
#endif
	 "]"},
#endif
#ifdef DOSV
	{"sws", BOOLEAN, (void *)&f_soft_scroll,
	 "software scroll"},
#endif

	{"s", INTEGER, (void *)&slow_fact,
	 "Half Screen Scroll speed(0,1,2,...)"},
	{"sh", INTEGER, (void *)&slow_fact2,
	 "Horizontal " AsAbove},
	{"t", INTEGER, (void *)&v_shift0,
	 "Vertical Scroll speed(-16,-15,..,0,1,2,...)"},
	{"u", INTEGER, (void *)&slow_page,
	 "Page Turning Speed(0,1,2,...)"},
#ifdef VFD
	{"RV", BOOLEAN, (void *)&tatevfd,
	 "Rotate vfd font"},
#endif
#if	defined(PC9801) || defined(DOSV) || defined(J3100)
	{"R", STRING, (void *)&colorbuf,
	 "Set {fore|back}ground color. (<RGBrgb> default:Reverse)"},
#endif
	{"B", STRING, (void *)&resume_file,
	 "Page resume"},
	{"r", STRING, (void *)&fc_name,
	 "Save Font"},
	{"c", BOOLEAN, (void *)&f_font_c,
	 "Check font matching"},
	{"F", STRING, (void *)&sub_font,
	 "Font substitute"},
	{"L", BOOLEAN, (void *)&f_long_name,
	 "cut center of long font names"},
	{"A", INTEGER, (void *)&f_search,
	 "Font search"},
	{"K", STRING, (void *)&k_dbl,
	 "Double size Kanji"},
	{"G", STRING, (void *)&goth,
	 "Poor man's Kanji Gothic"},
	{"g", BOOLEAN, (void *)&use_lateral_kanji,
	 "Use Lateral Kanji Font in pTeX `tate' mode"},
	{"JC", PROCEDURE, (void *)set_trans_jis,
	 "translate JIS code"},
	{"romf", PROCEDURE, (void *)use_romfont,
	 "dots of using Kanji ROM Font(<max>[:<min>])"},
	{"k", STRING, (void *)&k_16,
	 "dots excluding -romf (<dot>:<dot>:...)"},
	{"varf", BOOLEAN, (void *)&f_resize,
	 "resize all fonts"},
	{"base", BOOLEAN, (void *)&draw_baseline,
	 "draw the baseline"},
	{"box", BOOLEAN, (void *)&draw_boxpic,
	 "\x05" "boxes instead of characters"},
#ifndef	NOVFONT
	{"vfn", STRING, (void *)&vfont_name,
	 "Syotai Club's Font"},
#endif
#ifndef NO_NTTRPL
	{"nttF", STRING, (void *)&ntt_subst_fonts,
	 "NTTjTeX Nonstandard Font substitute"},
	{"ntt", BOOLEAN, (void *)&ntt_subst,
	 "\x08"   "Font substitute"},
#endif
	{"S", INTEGER, (void *)&k_scale,
	 "Kanji scale*1000 (default 952)"},
	{"J", INTEGER, (void *)&k_base,
	 "Kanji base line*1000 (default 0)"},
	{"W", INTEGER, (void *)&(s_max_width),
	 "V width   (pixel)"},
	{"H", INTEGER, (void *)&(s_max_height),
	 "V height"   AsAbove},
	{"P", INTEGER, (void *)&v_dx,
	 "V x_offset" AsAbove},
	{"Q", INTEGER, (void *)&v_dy,
	 "V y" AsAbove},
	{"C", BOOLEAN, (void *)&(f_center),
	 "V center"},
	{"M", BOOLEAN, (void *)&(f_max_bb),
	 "use -W, -H for bit map buffer"},
	{"E", INTEGER, (void *)&f_machine_unique,
#if		defined(PC9801)
	 "Exit Condition\n"},
#elif	defined(DOSV)
	"Video mode number\n"},
#elif	defined(J3100)
    "Machine type(0:Defalt, 1:DynaBook V)\n"
}
   ,
#else
	 "Not-Used\n"},
#endif
#ifndef	NNSZ
 /* by K.Yoshizawa  Dec. 26, 1992 */
	{"newsize", BOOLEAN, (void *)&f_use_new_size_option,
	 "use the following size option"},
	{"PW", LENGTH, (void *)&PW,
	 "paper width  [default 210mm(A4)]"},
	{"PH", LENGTH, (void *)&PH,
	 "paper height [default 297mm(A4)]"},
	{"y", PROCEDURE, (void *)youshi_size,
	 "Paper select [A3|A4|A5|B4|B5|H[p|l]]"},
	{"TM", LENGTH, (void *)&TM, "top    mechanical gap"},
	{"BM", LENGTH, (void *)&BM, "bottom" AsAbove},
	{"LM", LENGTH, (void *)&LM, "left  " AsAbove},
	{"RM", LENGTH, (void *)&RM, "right " AsAbove},
	{"MW", LENGTH, (void *)&MW, "max printable width"},
	{"MH", LENGTH, (void *)&MH, "\x0e"        "height"},
	{"OX", LENGTH, (void *)&OX, "horizontal move"},
	{"OY", LENGTH, (void *)&OY, "vertical  " AsAbove},
 /* by K.Yoshizawa  Dec. 27, 1992 */
	{"V", BOOLEAN, (void *)&(f_rotate), "Convert PW<->PH, LM<-TM<-RM<-BM<-LM"},
	{"esize", BOOLEAN, (void *)&enlarge_len, "Consider -e"},
	{"HC", BOOLEAN, (void *)&HC, "horizontal centering"},
	{"VC", BOOLEAN, (void *)&VC, "vertical  " AsAbove},
	{"HS", LENGTH, (void *)&HS, "horizontal shift after centering"},
	{"VS", LENGTH, (void *)&VS, "vertical shift after centering\n"},
#endif
	{"=", PROCEDURE, (void *)opt_cfg,
	 "parameter file"},
#endif

	{NULL}
};

void get_config(int argc, char **argv)
{
	int i, l;
	char real_name[MAXPATH], v_real_name[MAXPATH];
	char path_name[MAXPATH];
	char *cfgpath, *srcpath, *cfg_path;

	ENTER("get_config");

	fnsplit(argv[0], real_name, v_real_name, config_name, path_name);
	if (memcmp(strlwr(config_name), "dvi", 3) == 0)
		strcpy(progname, config_name);
	strcpy(config_name, progname);
	strcat(config_name, ".par");
	if (argc <= 1 ) return;

	if ((cfgpath = getenv(CFG_PATH)) != NULL) {
		strncpy(path_name, cfgpath, MAXPATH - 2);
		i = strlen(path_name);
		if (isalnum(path_name[i - 1])) {
			path_name[i] = '\\';
			path_name[i + 1] = '\0';
		}
		cfg_path = path_name;	/* とりあえず保存 */
		strcpy(real_name, cfg_path);
	}
	else{
		cfg_path = "";
		goto skp;
	}
	strcat(real_name, config_name);
	if (access(real_name, 0) == -1) {
	  skp:if ((srcpath = searchpath(config_name)) != NULL)
			strncpy(real_name, srcpath, MAXPATH - 2);
		else
			*real_name = 0;
	}
	if (*real_name)
		set_config(&option[0], real_name);
	set_option(&option[0], argc, argv);

#ifdef HIRES98
	/* PC9801 ハイレゾリューションモードの判定 */
	hireso = 0;					/* デフォルトはノーマルモード */
	if ((*(char far *)(0x00000501)) & 8) {
		/* システム共通域 0h:459h の ビット 3 でインターレースモードの調査 */
		hireso = ((*(char far *)(0x00000459)) & 8) ? 2 : 1;
		pk_buf_pointer->size = 0xffffL;
	}
	/* モード表示 */
#if	DEBUG1
	if (test_flg < 2) {
		switch (hireso) {
		  case 0:
			  fprintf(stderr, "\nNormal Mode\n");
			  break;
		  case 1:
			  fprintf(stderr, "\nHighReso. & Interlace\n");
			  break;
		  case 2:
			  fprintf(stderr, "\nHighReso. & Non-Interlace\n");
			  break;
		}
	}
#endif
#endif
#ifdef PC9801
	if (colorbuf != NULL) {		/* アナログカラー設定 */
		int work;

		work = strlen(colorbuf);
		if (work >= 6) {
			fore_color = atoh(colorbuf) * 16 + atoh(colorbuf + 1) * 256 + atoh(colorbuf + 2);
			back_color = atoh(colorbuf + 3) * 16 + atoh(colorbuf + 4) * 256
				+ atoh(colorbuf + 5);
			normal_16color = TRUE;	/* ノーマルで色指定あり */
		}
		f_reverse = TRUE;
		if (colorbuf[0] == '-' || colorbuf[1] == '-')
			f_reverse = FALSE;
	}
#endif
#if defined(DOSV) || defined(J3100)
	if (colorbuf != NULL) {		/* アナログカラー設定 */
		int work;

		work = strlen(colorbuf);
		if (work >= 12) {
			/* foreground color */
			s_color.fg.r = atoh(colorbuf + 0) * 16 + atoh(colorbuf + 1);
			s_color.fg.g = atoh(colorbuf + 2) * 16 + atoh(colorbuf + 3);
			s_color.fg.b = atoh(colorbuf + 4) * 16 + atoh(colorbuf + 5);
			/* background color */
			s_color.bg.r = atoh(colorbuf + 6) * 16 + atoh(colorbuf + 7);
			s_color.bg.g = atoh(colorbuf + 8) * 16 + atoh(colorbuf + 9);
			s_color.bg.b = atoh(colorbuf + 10) * 16 + atoh(colorbuf + 11);
			f_ramdac = TRUE;
		}
		if (work >= 12 || colorbuf[0] == '-' || colorbuf[1] == '-')
			f_reverse = FALSE;
		else
			f_reverse = TRUE;
	}
#endif
#ifndef	NOVFONT
	if (vfont_name != NULL && *vfont_name != '-') {
		f_use_vfont = TRUE;
		make_path(real_name,
			NULL,
			(*vfont_name == 0 || *vfont_name == '+')?"dviout":vfont_name,
			".vfn");
		make_path(v_real_name, cfg_path, real_name, NULL);
		if (access(v_real_name, 0) == -1) {
			if ((srcpath = searchpath(real_name)) != NULL)
				strncpy(v_real_name, srcpath, MAXPATH - 2);
		}
		if (0 != (l = get_vfont_name(v_real_name))) {
			if (l > 0)
				error(WARNING,
					"[vfont] %s error(line:%d)", real_name, l);
			else
				error(WARNING,
					"[vfont] Can't open %s", real_name);
		}
	}
#endif
}

void initialize(DVIFILE_INFO *dvi, DIMENSION *dim)
	/* 各種初期化
         */
{
	ENTER("initialize");

	read_post(dvi);
	set_dimension(dvi, dim);
	make_font_list(dvi, dim);
	make_page_index(dvi, dim);
	pixel_init(dvi, dim);
	buffer_init();
	stack_init(dvi->stack_depth);
	decode_init();
#ifndef NOTPIC
	if (f_tpic_turn_on)
		tpic_init(dim->buf_height);
	/* alloc y-bucket[vmax] and activate tpic interpretation */
#endif
	END();
}

/* set youshi size */
static void youshi_size(char *opt)
{
	int ch;

	ch = opt[1];
	switch (toupper(*opt)) {
	  case 'A':
		  if (ch == '4') {
			  PW = MM_TO_SP(210);
			  PH = MM_TO_SP(297);
		  }else if(ch == '3') {
			  PW = MM_TO_SP(297);
			  PH = MM_TO_SP(420);
		  }
		  else if (ch == '5') {
			  PW = MM_TO_SP(148.5);
			  PH = MM_TO_SP(210);
		  }
		  break;
	  case 'B':
		  if (ch == '4') {
			  PW = MM_TO_SP(257);
			  PH = MM_TO_SP(364);
		  }
		  else if (ch == '5') {
			  PW = MM_TO_SP(182);
			  PH = MM_TO_SP(257);
		  }
		  break;
	  case 'H':
		  PW = MM_TO_SP(100);
		  PH = MM_TO_SP(148);
		  break;
	  default:
		  error(ILLEGAL_ARGS, opt);
	  case 'F':
	  case 'T':
		  break;
	}
	while (*++opt) {
		switch (toupper(*opt)) {
		  case 'P':
			  f_rotate = FALSE;
			  break;
		  case 'L':
			  f_rotate = TRUE;
			  break;
		}
	}
}

/* optional parameter file */
static void opt_cfg(char *opt)
{
	set_config(option, opt);
}

void help_out(void)
{
	ENTER("help_out");

	printf("usage : %s [option(s)] dvifile [page(s) eg. 6-8 3+]\n\n", progname);
#ifdef	JAPANESE
	option_usage(option);
	printf("\n上記オプションは、 parameter file <%s> で指定可能\ \n", config_name);
#else
	printf("options are as follows :\n");
	option_usage(option);
	printf("\noptions can be directed in %s\n", config_name);
#endif
	EXIT(0);
}

#define CM_INCH 2.54
/* cm per inch */

static int pres;
static void set_dimension(DVIFILE_INFO *dvi, DIMENSION *dim)
	/* size_para, magnification, text_width, height の設定．
     */
{
	static int true_mag[] =
	{1000, 1200, 1440, 1728, 2074, 2488, 2986, 3583, 4300, 5160};

#ifndef	USE_FLAOT
	ulong num1, num2;
	long num3;
	int q;

#endif

	ENTER("set_dimension");

	dim->mag = (int)dvi->mag;

	if (mag_half)
		dim->mag = 1095;		/* magstep half */
	else {
		if (opt_mag != -1)
			if (opt_mag >= 0 && opt_mag <= 9)
				dim->mag = true_mag[opt_mag];
			else if(opt_mag >= 500)
				dim->mag = opt_mag;
			else
				error(ILLEGAL_ARGS, "mag step over");
	}

	dim->total_page = dvi->total_page;

	if (dim->dpi <= 0)
		error(ILLEGAL_ARGS, "dpi");

#ifdef	NOFLOAT
	num1 = mult_long((ulong)dvi->den, 254000000L);
	q = pres;

	num2 = mult_long((ulong)dvi->num, (ulong)dim->dpi);
	q -= pres;
	num2 = mult_long(num2, (ulong)dim->mag);
	q -= pres;

	num3 = 0;
	while (num1 >= num2) {
		num1 -= num2;
		num3++;
	}
	while (q-- >= 0) {
		num3 += num3;
		if ((num1 += num1) >= num2) {
			num1 -= num2;
			num3++;
		}
	}
	num3 >>= 1;
	if ((num3 & 1) != 0)
		num3++;
	if (enlarge != 0) {
		if (enlarge < 300 || enlarge > 4000)
			error(ILLEGAL_ARGS, "-e= should be 300-4000");
		else {
			num3 = num3 * 1000 / enlarge;
		}
	}
	dim->size_para = num3;
#else
	dim->size_para = ((double)dvi->num * (double)dim->dpi * (double)dim->mag) /
		((double)dvi->den * CM_INCH * 100000000.0);
#endif
	if (dim->DPI == 0)
		dim->DPI = dim->dpi;
	set_convert(dim->size_para, dim->dpi, dim->DPI);
	/* set pixel<==>scaled-pt parameter */

	if ((dim->text_width = sptopixel(dvi->u)) == 0)
		f_max_bb = TRUE;
	dim->text_height = vtopixel(dvi->l + HEADER_DEPTH + FOOTER_DEPTH);

	END();
}

#ifdef	NOFLOAT
static ulong mult_long(ulong num1, ulong num2)
{
	int i;

	if (num1 == 0 || num2 == 0) {
		pres = 0;
		return (0L);
	}
	i = 0;
	while (num1 >= 0x2000000L) {
		i++;
		num1 >>= 1;
	}
	while (num1 < 0x1000000L) {
		i--;
		num1 += num1;
	}
	while (num2 >= 0x2000000L) {
		i++;
		num2 >>= 1;
	}
	while (num2 < 0x1000000L) {
		i--;
		num2 += num2;
	}
	pres = i + 20;
	return (mult20(num1, num2));
}
#endif

#define	END_DVI	223
#define ID		2
#define ID_PTEX 3

/* id number for searching for postamble
     */

static void read_post(DVIFILE_INFO *dvi)
	/* POSTAMBLEからのデータ読み出し．
     */
{
	long endofs;
	int code;

	ENTER("read_post");

	if ((uchar)read_byte(dvi->file_ptr) != PRE ||
		(uchar)read_byte(dvi->file_ptr) != ID) {
		error(FILE_FAULT, "Not DVI file");
	}
	for (endofs = -3L; fseek(dvi->file_ptr, endofs, SEEK_END),
		 (code = (uchar)read_byte(dvi->file_ptr)) != ID; endofs--)
		/* Search id number
             */
		if (code == ID_PTEX) {
#ifdef	DEBUG1
			printf("Extended DVI file encountered. Turn on pTeX mode.\n");
#endif
			ptex_mode++;
			break;
		}
		else if (code == EOF || code != END_DVI)
			error(FILE_FAULT, "No ID");

	fseek(dvi->file_ptr, endofs - 4L, SEEK_END);
	if ((dvi->post = read_long(dvi->file_ptr)) <= 0)
		error(COMMAND_ERROR, "Negative Pointer(POST)");
	/* Read the position of POSTAMBLE */

	fseek(dvi->file_ptr, dvi->post, SEEK_SET);
	/* Set file-ptr at POSTAMBLE */

	if ((uchar)read_byte(dvi->file_ptr) != POST)
		error(COMMAND_ERROR, "No Postamble");

	if ((dvi->last_bop = read_long(dvi->file_ptr)) <= 0)
		error(COMMAND_ERROR, "Negative Pointer(Last BOP)");

	dvi->num = read_long(dvi->file_ptr);
	dvi->den = read_long(dvi->file_ptr);
	org_mag = dvi->mag = read_long(dvi->file_ptr);

	dvi->l = (SCALED_PT)read_long(dvi->file_ptr);
	dvi->u = (SCALED_PT)read_long(dvi->file_ptr);

	dvi->stack_depth = read_int(dvi->file_ptr);
	dvi->total_page = read_int(dvi->file_ptr);

	if (dvi->num <= 0 || dvi->den <= 0 || dvi->mag <= 0)
		error(COMMAND_ERROR, "Reading Illegal Long");

	if (dvi->stack_depth < 0 || dvi->total_page <= 0)
		error(COMMAND_ERROR, "Reading Illegal Integer");

	END();
}

#ifndef	NNSZ
static void calc_new_size_option(DVIFILE_INFO *dvi, DIMENSION *dim)
	/* Added by K.Yoshizawa  Dec. 26, 1992
	 * Modified by K.Yoshizawa  Dec. 27, 1992
	 */
{
	SCALED_PT w, h;
	double sc;

	sc = (enlarge_len && enlarge != 0)?enlarge:1000;
	sc /= 1000;

/* ●ステップ１：用紙のサイズから、印字可能領域を計算 */

	w = PW - LM - RM;			/* w はその用紙で印字すべき最大幅の暫定値 */
	h = PH - TM - BM;			/* h はその用紙で印字すべき最大長の暫定値 */

	if (MW > 0) {				/* 印字可能域の最大幅の指定あるとき */
		if (w > MW) {
			RM += w - MW;		/* 用紙が広すぎる：右マージンを増やす */
			w = MW;
		}
	}
	else {						/* 印字可能域の最大幅の指定無きとき */
		MW = w;					/* この幅まで印字できると仮定する */
	}

	if (MH > 0) {				/* 印字可能域の最大長の指定あるとき */
		if (h > MH) {
			BM += h - MH;		/* 用紙が長すぎる：下マージンを増やす */
			h = MH;
		}
	}
	else {						/* 印字可能域の最大長の指定無きとき */
		MH = h;					/* この長さまで印字できると仮定する */
	}

	/* この時点で、(w, h) はその用紙での印字可能領域のサイズとなっている */

	if (w <= 0 || h <= 0) {
		error(PROGRAM_STOP,
#ifdef	JAPANESE
			  "印刷可能領域がありません：サイズ関係オプション要チェック"
#else
			  "No printable area! Please examine size options."
#endif
			);
	}

	/* dvi ファイルから読み取ったテキスト・サイズを元に設定した値
	 *（set_dimension() で設定）は無視して、設定しなおす。 */
	dim->text_width = ROUND(SP_TO_IN(w) * dim->dpi * sc);
	dim->text_height = ROUND(SP_TO_IN(h) * dim->DPI* sc);

/* ●ステップ２：続いて、オフセットの計算 */

	if (HC) {
		/* 水平方向にセンタリングする場合 (dvi->u : テキスト幅) */

		/* 用紙幅に対してセンタリングするバージョン */
		dim->x_offset = ROUND(SP_TO_IN((PW - dvi->u) / 2 - LM + HS) * dim->dpi);

		/* 印字可能幅に対してセンタリングするバージョン */
		/*dim->x_offset = ROUND( SP_TO_IN( (w - dvi->u)/2 + LM + HS) * dim->dpi);*/
	}
	else {
		dim->x_offset = ROUND((SP_TO_IN(OX - LM) + 1)* dim->dpi * sc);
	}

	if (VC) {
		/* 水平方向にセンタリングする場合 (dvi->l : テキスト高) */

		/* 用紙長に対してセンタリングするバージョン */
		dim->y_offset = ROUND(SP_TO_IN((PH - dvi->l) / 2 - TM + VS) * dim->DPI
			* sc);

		/* 印字可能長に対してセンタリングするバージョン */
		/*dim->y_offset = ROUND( SP_TO_IN( (h - dvi->l)/2 + TM + VS) * dim->DPI
			 * sc);*/
	}
	else {
		dim->y_offset = ROUND((SP_TO_IN(OY - TM) + 1) * dim->DPI * sc);
	}
}
#endif

static void pixel_init(DVIFILE_INFO *dvi, DIMENSION *dim)
	/* 表示枠の設定．
     */
{
	long bb_size, free_size;
	int f_raster;
	SCALED_PT len;

#ifndef	NEMS
	int raster_page;

#endif

	ENTER("pixel_init");

#ifndef	NNSZ
if (f_use_new_size_option) {
		if (f_rotate) {
			len = PH;
			PH = PW;
			PW = len;
			len = TM;
			TM = RM;
			RM = BM;
			BM = LM;
			LM = len;
			len = MH;
			MH = MW;
			MW = len;
		}
		calc_new_size_option(dvi, dim);
	}
	else 
#endif
		{
		if (f_center) {
			x_shift = (s_max_width - dim->text_width) / 2 + v_dx
				- dim->x_offset;
			y_shift = (s_max_height - dim->text_height) / 2 + v_dy
				- dim->y_offset;
		}
		dim->text_width += dim->x_offset + add_width;
		dim->text_height += dim->y_offset + add_height;
		if (f_max_bb) {
			dim->text_width = s_max_width;
			dim->text_height = s_max_height;
		}
	}

#if	defined(DOSV) || defined(HIRES98) || defined(J3100)
	set_disp_reso();
#endif
#ifndef	NEMS
	if (num_view < 0 && num_view >= -MAX_VIEW) {
		view_EMS_unit = (view_buf_size + 0x3fffL) / 0x4000L;
		if (view_EMS_unit <= 4 &&
			user_ems - num_view * view_EMS_unit <= total_EMS_page) {
			user_ems -= num_view * view_EMS_unit;
		}
		else {
			num_view = view_EMS_unit = 0;
		}
	}
	raster_page = ((total_EMS_page - user_ems) / 4) * 4;
	if (raster_page > 0) {
		buffers[0].type |= f_EMS;	/* Expanded font buffer */
		buffers[0].ems_last = raster_page;
	}
	else
		raster_page = 0;
#endif
	if (buffers[0].size < 0) {
		f_raster = -1;
		buffers[0].size = -buffers[0].size;
	}
	else
		f_raster = (buffers[0].size == 0L) ? 0 : 0x4000;
	free_size = (long)leftbuffer() - buffers[0].size - buffers[1].size
		- buffers[2].size - buffers[3].size - (FAR_HEAP + 0x100);
	if (buffers[2].size == 0L) {/* Bit map buffer */
		bb_size = ((long)(dim->text_width + (HORI_DIVIDE - 1))) / HORI_DIVIDE
			* (HORI_DIVIDE / 8) *
			(((long)(dim->text_height + (VERT_DIVIDE - 1))) / VERT_DIVIDE * VERT_DIVIDE);
		free_size -= bb_size;
#ifdef HIRES98
#ifdef USE_HIRESBIOS
		/* deviceh.c の device_init における ucw=farmalloc(..) のため*/
		if (hireso)
			free_size -= 0x390;
#endif
#endif
		if (num_view > 0)
			free_size -= view_buf_size * num_view;
		if (free_size > 0) {
			buffers[2].size = bb_size;
			if (f_raster - raster_page >= 0) {
				buffers[0].size += free_size;
				free_size = 0;
			}
		}
		else {
			buffers[2].size = bb_size + free_size;
			free_size = 0;
		}
	}
	if (buffers[0].size <= 0x2000 && !raster_page) {
		buffers[0].size = 0x2000;
		buffers[2].size -= 0x2000;
	}
	if (bb_size > 0x2000 && buffers[2].size <= 0x2000) {
		buffers[2].size = 0x2000;
		buffers[0].size -= 0x2000;
	}
	if (buffers[3].size < 0)
		buffers[3].size = (free_size >= 2048) ? free_size : 0;
	dim->split = set_size(dim->text_width, dim->text_height,
						  dim->max_width, dim->max_height,
						  &dim->buf_width, &dim->buf_height);
	END();
}

static void make_page_index(DVIFILE_INFO *dvi, DIMENSION *dim)
{
	int i;
	long offset;

	ENTER("make_page_index");

	dim->page_index =
		(PAGE_INDEX *)
			farmalloc(sizeof(PAGE_INDEX)*(long)(dvi->total_page + 1));

	for (offset = dvi->last_bop, i = dvi->total_page; i > 0; i--) {
		fseek(dvi->file_ptr, offset, SEEK_SET);
		if ((uchar)read_byte(dvi->file_ptr) != BOP)
			error(COMMAND_ERROR, "No BOP command in page %d", i);

		dim->page_index[i].offset = offset;
		dim->page_index[i].number = read_long(dvi->file_ptr);
		/* Read count[0] */
		fseek(dvi->file_ptr, 36L, SEEK_CUR);
		/* Skip other 'count' values */
		offset = read_long(dvi->file_ptr);
	}

	END();
}

#if defined(PC9801) || defined(DOSV) || defined(J3100)
static uint atoh(char *pt)
{
	char c;

	c = toupper(*pt);
	return (c >= '0' && c <= '9') ? c - '0' : 0 + (c >= 'A' && c <= 'F') ? 10 + c - 'A' : 0;
}

#endif
/* end of file : init.c */
