#ifndef _STDIO_H
#include <stdio.h>
#endif

#ifndef _TIME_H
#include <time.h>
#endif

#define PROTO
#define PROTOEND
#define BUNRUI_NUM       23      /* 分類の種類の個数 */
#define BUNRUI_LEN       24      /* 分類名のバイト数 */
#define MEDIA_NUM         5      /* メディアの種類の個数 */
#define MEDIA_LEN         8      /* メディア名のバイト数 */
#define TEIKA_MIN           0    /* 定価の最小値 円      */
#define TEIKA_MAX    10000000    /* 定価の最大値 円      */
#define RAM_MIN             0    /* メモリの最小値    K bytes      */
#define RAM_MAX     (100*1024)   /* メモリの最大値    K bytes      */
#define HD_MIN              0    /* ディスクメモリの最小値 K bytes */
#define HD_MAX     (1024*1024)   /* ディスクメモリの最大値 K bytes */
#define TNAME1_LEN    60
#define TNAME2_LEN    60
#define TMAKER_LEN    40
#define TABOUT_LEN    80
#define TNUM_LEN       8
#define TINFOM_LEN    50
#define CODE_NUM       4
#define TDOCFL_LEN    12
#define TLSTBUF_LEN  110

#define SFTLIBEXP    "SFTLIB.EXP"
#define SFTLIBSFT    "SFTLIB.SFT"
#define SFTLIBIND    "SFTLIB.IND"
#define SFTLIBDAT    "SFTLIB.DAT"
#define SFTLIBCFG    "SFTLIB.CFG"

#define      DWORD(x)    *((unsigned int *)(x))
#define      WORD(x)     *((unsigned short int *)(x))
#define      BYTE(x)     *((unsigned char *)(x))

typedef unsigned long  ulbit_t;

typedef     struct {
            char d_system[3];          /* システム         3[A-Z] */
            char d_name1h;             /* タイトルキー      [A-Z] */
            char d_name2h;             /* サブタイトルキー  [A-Z] */
            char d_makerh;             /* メーカーキー      [A-Z] */
            char d_abouth;             /* 概要キー          [A-Z] */
            char d_infomh;             /* 周辺機器キー      [A-Z] */
            char d_code[CODE_NUM] ;    /* 管理コード         注3    */
            ulbit_t  d_media;          /* メディア           注1    */
            ulbit_t  d_sort  ;         /* 分類コード         注2    */
            long   d_teika;              /* 定価               円     */
            long   d_ram;                /* 必要メモリ         K Byte */
            long   d_hd;                 /* 必要ハードディスク K Byte */
			time_t d_date1;               /* データ作成日           */
			time_t d_date2;               /* データ更新日           */
			time_t d_date3;               /* 発売日                 */
			time_t d_date4;               /* 貸出日                 */
			time_t d_date5;               /* 返却予定日             */
			time_t d_date6;               /* xxxxxxxx日             */
			time_t d_date7;               /* yyyyyyyy日             */
			time_t d_date8;               /* zzzzzzzz日             */
			char d_name1[TNAME1_LEN+1] ;  /* ソフトのタイトル          */
            char d_name2[TNAME2_LEN+1] ;  /* サブタイトル(ﾊﾞｰｼﾞｮﾝなど) */
            char d_maker[TMAKER_LEN+1] ;  /* メーカー                  */
            char d_about[TABOUT_LEN+1] ;  /* ソフト概要紹介文          */
            char d_infom[TINFOM_LEN+1] ;  /* 必須･対応周辺機器         */
            char d_docfile[TDOCFL_LEN+1]; /* ドキュメントファイル名    */
			char d_filer[140];            /* 予備                      */
        } soft;
        


typedef struct {
			int  dataid;             /* ワーク領域              */
			int  softno;             /* softdata番号            */
            char system[3];          /* システム         3[A-Z] */
            char name1h;             /* タイトルキー      [A-Z] */
            char name2h;             /* サブタイトルキー  [A-Z] */
            char makerh;             /* メーカーキー      [A-Z] */
            char abouth;             /* 概要キー          [A-Z] */
            char infomh;             /* 周辺機器キー      [A-Z] */
            ulbit_t  media;          /* メディア           注1    */
            ulbit_t  sort  ;         /* 分類コード         注2    */
            long  teika;             /* 定価               円     */
            long  ram;               /* 必要メモリ         K Byte */
            long  hd;                /* 必要ハードディスク K Byte */
			time_t date3;            /* 発売日                 */
			time_t date4;            /* 貸出日                 */
			time_t date5;            /* 返却予定日             */
			time_t date6;            /* xxxxxxxx日             */
			time_t date7;            /* yyyyyyyyyy             */
			time_t date8;            /* zzzzzzzzzz             */
			char  filer[16];         /* 予約                   */
            char  code[CODE_NUM] ;      /* 管理コード         注3    */
			char  codenl;               /* NULL or SPAXE */
            char  lstbf[TLSTBUF_LEN] ;  /* 表示用タイトル文字 */
			char  lstbfnl;              /* NULL */
        } index;

typedef struct {
            ulbit_t code0bit;  /* 管理コード0         */
            ulbit_t code1bit;  /* 管理コード1         */
            ulbit_t code2bit;  /* 管理コード2         */
            ulbit_t code3bit;  /* 管理コード3         */
            ulbit_t sortbit;   /* 分類コード          */
            ulbit_t mediabit;  /* メディア            */
            ulbit_t name1bit;  /* タイトルの1文字     */
            ulbit_t name2bit;  /* サブタイトルの1文字 */
            ulbit_t makerbit;  /* メーカの1文字       */
            ulbit_t aboutbit;  /* 概要                */
            ulbit_t infombit;  /* 必須･対応周辺機器   */
            long    teikad;    /* 定価下          円  */
            long    teikau;    /* 定価上              */
            long    ramd;      /* 必要メモリ下   Byte */
            long    ramu;      /* 必要メモリ上        */
            long    hdd;       /* 必要ハードディスク下    */
            long    hdu;       /* 必要ハードディスク上    */
        } search;

/*
**              注１  メディア 
**                      0 : CD,  1 : CD+FD,  2 : FD,  3 : CD 8cm, 4 : IC
**
**              注２  分類コード sftlib.cfg 参照
** 
**              注３  管理コード (ユニークな番号)
**                      ４つ文字列ですべてのソフトウェアを管理する。
**                      例えば、アフターバーナーを新規登録する。
**                      Ａ    Ａ    ０    ０  
**                      ↑    ↑      ↑
**                                      この２つの０は、詳細番号を意味する。
**                      ↑    ↑        ００からＦＦまでの１６進数で管理する。
**                            ↑ソフトメインタイトルの１文字目をローマ字に直
**                      ↑      したときの頭の文字（アルファベット）
**                      ↑ジャンルコード０から２２までをＡから順に対応させる。
*/


/* 環境変数 */
extern char   *guiEgbPtr;

extern char    DB_sftlibp[_MAX_PATH];  /* データファイルのパス             */
extern char    DB_sftcfgp[_MAX_PATH];  /* コンフィグファイルのパス         */
extern int     DB_sftcfgm; /* 0:環境ファイルを保存しない 1:する 2:対話する */
extern char    DB_indexp[_MAX_PATH];   /* インデックスファイルのパス       */
extern char    DB_docdir[_MAX_PATH];   /* 説明ファイルのあるディレクトリ名 */
extern char    DB_tifflp[_MAX_PATH];   /* TOOLS の画像データのパス         */
extern char    media_mes[MEDIA_NUM][MEDIA_LEN+1];
extern char    bunrui_mes[BUNRUI_NUM][BUNRUI_LEN+1];
extern char    date_mes[6][13];        /* 日日名                       */

extern char    DB_help0p[_MAX_PATH];   /* ヘルプファイルのパス         */
extern char    DB_help1p[_MAX_PATH];   /* ヘルプファイルのパス         */
extern char    DB_help2p[_MAX_PATH];   /* ヘルプファイルのパス         */
extern char    DB_help3p[_MAX_PATH];   /* ヘルプファイルのパス         */
extern char    DB_help4p[_MAX_PATH];   /* ヘルプファイルのパス         */


extern char    DB_docp[_MAX_PATH];     /* 説明ファイルのパス */
extern char    DB_startp[_MAX_PATH];   /* 起動パス */
extern search  DB_search;              /* 検索条件 */
extern char    palette0[4+16*8];       /* page 0 のパレット */
extern char    palette1[4+16*8];       /* page 1 のぱれっと */
extern char    palette0_old[4+16*8];   /* パレットの控え    */
extern char    palette1_old[4+16*8];  
extern int     DB_lstmode;             /* リストの列数  (1-10)     */
extern int     DB_pmodec1;             /* 管理コードを表示するか   */
extern int     DB_cndmode;             /* 条件有効フラグ           */
extern int     DB_sortmode;            /* 0-8 */
extern int     DB_sortrev;             /* 1:off -1:on */

extern int     DB_base ;     /* GUIで使用 */
extern int     DB_baseTop ;  /* GUIで使用 */
extern int     DB_page ;     /* GUI 書き込み　ページ */
extern index  *DB_dataary;   /* index データの実体 */
extern int     DB_datamax;   /* DB_dataary[]の個数最大値 */
extern int     DB_datanum;   /* DB_dataary[]の入力個数 */
extern int     DB_datalnm;   /* DB_dataary[]の検索個数   */
extern soft    DB_nowdata;   /* 現在表示しているデータ   */
extern int     DB_lstline;   /* リストの行数             */

/* mains.c */
extern int DB_init( char *optfile );
extern int DB_end( void );

extern int getval_search( FILE *fp, search *sch );
extern int setval_search( FILE *fp, search *sch );
extern int DB_readopt( char *optfile );
extern int DB_readcfg( char *cfgfile );
extern int DB_indexRead();
extern int DB_base_dsp();
extern int DB_writecfg( char *cfgfile );
extern int DB_mkind( void);

/* mdfys.c */
extern int DB_strccpy( char *d, char *s, int dlen );
extern int DB_mdfy_getdata( soft *data );
extern int DB_mdfy_setdata( soft *data );
extern int DB_mdfy_cttlsp( soft *data );
extern int DB_mdfy_call( int n , index *ind);
extern int DB_mdfy_dateCall( char *str, time_t *t);
extern char DB_mdate[6][28];


/* mesagf.c */
extern int DB_YESNO_ALERTCall( char *text );

/* roots.c */
extern int DB_MakeList(void);
extern int check( index *ind );
extern int DB_showData( void );
extern int DB_showDataNum( int num );
extern int DB_getlstptr( int *x);
extern int DB_setlstptr( int x);

/* sconds.c */
extern int get_DB_search( void );
extern int set_DB_search( void );

/* sub.c */
extern int getstr( FILE *fp, char *buf,int len); /* FILE から文字列を読み込む*/
extern int DB_atoi( char *str);
extern int DB_schch( FILE *fp, int x );
extern int DB_schstrch( FILE *fp, char *str );
extern int DB_filelength( FILE *fp );
extern ulbit_t   DB_ctob( char x);   /* 英字1文字をビットに変換する */
extern ulbit_t   DB_ctoi( char x);   /* 数字1文字をビットに変換する */
extern int data2ind( soft *x, index *y);   /* soft x をindex y に変換 */
extern int getcldata( soft *x );           /* soft x の初期化 */
extern char *DB_btoc( ulbit_t x ); /* ビットを英字1文字に返還 */
extern int DB_cuttlsp( char *str, int len );
extern char *DB_ctime( time_t *t);

/* subgui.c */
extern int DB_boxobj( int kobj ); /*オブジェクトkobjの領域を枠の色で塗り潰す*/

/* sconds.c */
extern int             get_DB_serch( void );
extern int             set_DB_serch( void );

/* typedf.c */
extern int DB_typeAlertCall( char *title, char *fname );

/* tiffput.c */
extern int tiff_prt( char *tiffname, int x1, int y1, int x2, int y2 );

/* workf.c */
extern int DB_work_open( char *title, char *str);
extern int DB_work_put( char *str );
extern int DB_work_close( void ) ;


/* INFO */
int AMI_INFO_call(char *a[7], char *btn);
int AMI_INFO_call_1(char *str );
int AMI_INFO_freemem();

/* FILED */
typedef struct {
		unsigned int  attr;
		char drive[_MAX_DRIVE];
		char dir[_MAX_DIR];
		char fname[_MAX_FNAME];
		char ext[_MAX_EXT];
		} AMI_PATH_t;
int AMI_cd( char *path ) ;
int AMI_pathsplit( AMI_PATH_t *ps, char *path) ;
int AMI_FILED_getpath_A(char path[], char *title,
				char *execstr, char *cnclstr , int base) ;
int AMI_FILED_getpath( char path[], char *title,
				char *execstr, char *cnclstr , int base) ;
void *AMI_malloc( size_t sz ) ;
void AMI_free( void *ptr ) ;
int AMI_FILED_fread( char *fname, char *ptr) ;

/* PLT */
int AMI_PLT_setplt( unsigned char plt[16][4] );
unsigned char *AMI_PLT_now( int page );
int AMI_PLT_call( int page, unsigned char *plt );
int AMI_PLT_fout( const char *fname );
int AMI_PLT_fin( const char *fname );

/* PTGL */
extern int AMI_ExecSystemA( int *endflg, int btn[2] ) ;
extern int AMI_PTGL_call( char *b1,char *b2, int *n, int *s) ;

