/* static char sccsid[]="%Z% %M% %I% %E% %U%"; */
/************************************/
/* <cllocal.h>						*/
/*		coal struct					*/
/************************************/
#ifndef INC_CLLOCAL
#define INC_CLLOCAL

/**********************************
	コマンドのCompile and Execute
***********************************/
typedef struct {
	int cid;
	int *exobj;
	char **da;
	int  option;
	short nobj;
	short nda;
} CMDObject;

/******************************
	式のTree
*******************************/
typedef struct _WHERE_TREE {
	short mcode;
	short t1;
	short t2;
	short t3;
	short lv;
	short rv;
	short resv1;
	short resv2;
/*
	struct _WHERE_TREE *t1;
	struct _WHERE_TREE *t2;
*/
} WHERE_TREE;

/******************************
	式のCompile and Execute
*******************************/
typedef struct {
	short maxda;
	short maxobj;
	short maxobj0;
	short nda;
	short nobj;
	short nobj0;
	short *obj;
	char **da;
	int  index0;	/* 0x10:exist OR,AND */
	tdtInfoParm **obj0;
	int  option;
	tdtInfoParm **obj0org;
#if 1	/* 2021.11.1 */
	WHERE_TREE *tree;
	int ntree;
#else
	char **stack;
#endif
} GXObject;

typedef struct {
	char  id[2];
	short nda;
	short nobj;
	short nobj0;
	MCAT *ms_obj;
	MCAT *ms_da;
	MCAT *ms_obj0;
	int  index0;
	int  option;
} GXObjectExpand;

/*******************************/
/*  */
/*******************************/
typedef struct {
	short alsz;
	short used;
	char  *resv;
	tdtInfoParm **Obj0;
} tdtObjHead;

/*******************************/
/* グローバルエリア (parmList) */
/*******************************/
typedef struct parmList {		/*** パラメータリスト ***/
	int      prmlen;
	char     *prp;
	int      opt;
	GXObject *bxobj;
} parmList;

/*******************************/
/* グローバルエリア (condList) */
/*******************************/
typedef struct cmdInfo {		/*** コマンド情報 ***/
	int   rc;						/* 行番号					*/
	int   cid;						/* コマンドID				*/
	int   sub_cid;					/* サブコマンドID			*/
	uchar type;						/* タイプ(処理上のレベル)	*/
	uchar pos;						/* パラメータ開始位置		*/
	short prmnum;					/* パラメータ個数			*/
	parmList **prmp;				/* パラメータ				*/
	ParList *parl;
	int   parnum;
	CMDObject *cmdobj;
} cmdInfo;

typedef struct Leaf {
	struct Leaf *preleaf;		/*  前のリーフ        */
	struct Leaf *rightleaf;		/*  右のリーフ        */
	struct Leaf *leftleaf;		/*  左のリーフ        */
	char         pFlag;			/*  プロセスフラグ    */
	char         cmdtag;		/* */
	char         pad[2];		/* */
	int          type;			/*  コマンドのレベル  */
	cmdInfo      cmd;			/*  コマンド情報      */
} Leaf; 

/*****  CLNCB  *************************/
typedef struct CLNCB {
	Leaf    *TopStack;			/* スタックの先頭       */
	int      StackCounter;		/* スタックカウンタ     */
	Leaf    *nestLev1;			/* レベル１リーフ       */
	Leaf    *nestLev2;			/* レベル２リーフ       */
	Leaf    *nestLev3;			/* レベル３リーフ       */
/*	VarTBL  *vary ;	*/
	Leaf    *TopTreeSave;		/* Treeの先頭の退避		*/
	Leaf    *TopTree;			/* Treeの先頭       */
	Leaf    *DefTopStack;		/* Define スタックの先頭 */
} CLNCB;

/********************************/
/* グローバルエリア (tableRoot) */
/********************************/
typedef struct tableRoot {	/*** テーブルのルート ***/
	int   cmds_len;				/* 領域の長さ               */
	char *cmds;					/* 領域の先頭               */
	int   cmds_offset;			/* 次回に格納する領域の先頭 */
} tableRoot;

typedef struct condList {		/*** 情報リスト ***/
	char   *fname;					/* script name		*/
	FILE   *fp;						/* ファイルポインタ	*/
	char   *rbuf;
	int     line;					/* 処理行数			*/
	cmdInfo cmd;					/* 情報				*/
	ConstantCt	*ConstCt;			/* 定数テーブル		*/
	char   *fullname;				/* Path+fname		*/
	int     option;
	MCAT    *mcat;
	int     max_prmnum;
	MCAT    *mcat_obj;
	MCAT    *mcat_da;
} condList;

/***************************************/
/* 制御ブロックの定義                  */
/***************************************/
typedef struct prmList {
	int      VarLen;
	void    *VarBD;
	char     VarType;
} prmList;

typedef struct  ListPacBody  {
	long          AllFieldlen;
	MCAT          mCat;
	tdtIndirectInfo indInfo;
	char          fname[16];
} ListPacBody;

/***********************************************/
/*                                             */
/***********************************************/
typedef struct {
	int   size;
	char *data;
	int   ntype;
	parmList  **vname;
	tdtInfoParm **pType;
} tdtDefType;

/***********************************************/
/*                                             */
/***********************************************/
typedef struct {
	char  uAttr[4];
	int   size;
	tdtInfoParm **pVarIndex;
	int   index[(4+MAX_ARRAY_DIM)*2];
			/*   0   : dim
			     1   : max_array	最大要素数
			     2   : max_set		off_setから設定済み要素の最大位置(先頭が1)までの個数, <0 HASH 
			     3   : off_set
			     4   : m1			1次元目の要素数
			     5   : m2			2次元目の要素数
			     6   : m3			3次元目の要素数
			   ...
			   dim+3 : m1_2			1次元目の開始Index番号
			   dim+4 : m2_2			2次元目の開始Index番号
			   dim+5 : m3_2			3次元目の開始Index番号
			   ... 			*/
	XHASHB *xhp;
	tdtInfoParm *pInfoType;
} tdtArrayIndex;

typedef struct FreamCB  {					/****フレームＣＢ **********/
	struct FreamCB *nextFRCB;
	int    len;
	char   *pBuff;
} FreamCB;

typedef struct PacketCB {					/**** パケットＣＢ *********/
	int      AllBuffSize;
	FreamCB  *pFRCB;
} PacketCB ;

typedef struct BlockCB {				/**** ブロックＣＢ ****/ 
	struct BlockCB *preBlockCB;
	struct BlockCB *nextBlockCB;
	void	*block;
	int		cid;						/* ブロック種別 */
	Leaf	*Blockleaf;
	int		TureFlag;
	int		ElseFlag;
	int		EndFlag;
	char	*pSwParm;
	uchar	ucExcept;
	uchar	try_level;
	uchar	pFlag;
	uchar	iUsed;
	int		iLoopCounter;			/* ループカウント  */
	int		iLoopMax;				/* ループ最大値    */
	tdtInfoParm *pEachParm;
	int		iOpt;
	char	*BlockName;
} BlockCB;

typedef struct INPCB {
	char   *parmtop;
	char   *curaddr;
	int     curlen;
	int     maxlen;
	uchar   status;
	char    padding[3];
} INPCB;

typedef struct {
	int nparam;
	int maxlen;
	parmList  **parmLp;
	int iparam;
	char *line;
	int line_len;
} GWPRM_S;

typedef struct {
	char       *pId;
	ConstantCt *ConstCt;			/* 定数テーブル			*/
	ConstantCt *LeafConstCt;		/* 式コンパイル結果定数テーブル	*/
	Leaf       *NodeLeaf;
} ScrConstCt;

typedef struct {
	int		pFlag2;
	FILE	*stdio[4];
	char	*HereDoc_nm;
} tdtREDIRECT;

typedef struct ProcCT {				/*** プロシージャテーブル ***/
	struct ProcCT	*prePCT;		/* 前のプロシージャ       */
	struct ProcCT	*nextPCT;		/* 次のプロシージャ       */
	Leaf			*ProcTop;		/* プロシージャ先頭リーフ */
	Leaf			*Curleaf;		/* 現在実行中リーフ       */
	char			*ProcPath;
	Leaf			*Nextleaf;		/* Next leaf           */
	BlockCB			*pTopBlockCB;	/* BlockCBトップ		*/ 
	BlockCB			*pcrBlockCB;		/* BlockCBカレント		*/ 
	INPCB			INPCB;			/* Input function contorol */
	tdtRbCtl		*pRetStack;		/*         */
	int				varnam_pasento;
	XHASHB			*pha_vnam;
	tdtInfoParm		***pTBL_pasento;
	tdtInfoParm		***pTBL_vnam;
	uchar			ptype;			/* */
	char			pFlag;
	uchar			ucExcept;
	char			pFlag2;
	char			*ProcNM;		/* プロシージャ名         */
	tdtInfoParm		*Retval;
	ConstantCt		*pTmpConstCt;
	int				ixobj0;
	tdtObjHead		*Obj;			/* obj0 */
	Leaf			*Nodeleaf;		/* Node leaf           */
	int				exception;
	int				ProcGid;
	tdtInfoParm		**ppExecParm;
	ScrConstCt		*pScrConstCt;
	int				try_level;
#if 1	/* 2022.5.21 */
	tdtREDIRECT		*redirect;
	char			*pading[4];
#else
	FILE			*stdio[4];		/* 現在の保存用 */
	char			*HereDoc_nm;
#endif
} ProcCT;

#ifdef NEW_VARTBL
typedef struct {
	short     max_ix
	short     max_iy
	int       used;
	tdtInfoParm ***pTBL;
	XHASHB    *pha;
} VarTBL_name;

typedef struct {				/*** 変数テーブル ***/
	VarTBL_name *iget;
	VarTBL_name *doll;
	VarTBL_name *psnt;
	VarTBL_name *vnam;
} VarTBL;
#else
typedef struct VarTBL {			/*** 変数テーブル ***/
	int       varnam_igeta;
	int       varnam_dolu;
	int       varnam_pasento;
	XHASHB    *pha_vnam;
	tdtInfoParm ***pTBL_dolu;
	tdtInfoParm ***pTBL_igeta;
	tdtInfoParm ***pTBL_pasento;
	tdtInfoParm ***pTBL_vnam;
} VarTBL;
#endif

typedef struct ONTBL  {			/*** ＯＮ条件テーブル ***/
		int   FldNum;
		uchar PrSel[4];
		char  *PrName[4];		/* 0:GR-1, 1:GR-2, 2:GR-3, 3:XML-TAG */
} ONTBL;

typedef struct SearchResult {			/*** 検索結果構造体 ***/
	char                  szType[2];	/* 格納タイプ             */
	char                 *sAreaId;		/* データ格納エリアＩＤ   */ 
	int                   iTupleNum;	/* タプル数               */
	int                   iCrTuple;		/* カレントタプル番号     */
	int                   iColmNum;		/* カラム数               */
	char                 *pzFileName;	/* ファイル名             */
	int                  *iIndex;		/* インデックス           */
	void                 *RslBody;		/* 検索結果データの先頭   */
	int                   iDataLen;		/* データ長               */
	int                   iIndexLen;	/* インデックス長         */
	struct SearchResult	*Next;			/* 次の構造体のポインター */
} SearchResult;

typedef struct GlobalCt{			/*** システム変数管理 ***/
	int		tuppl; 
	int		error;
	int		Return;
	tdtInfoParm *Retval;
	char	usrcod[16];
	char	Date[16];
	char	Hid[8];
	char	Trnshid[84];
	char	usrinf[D_USER_INF];
	int		column;
	char	errmsg[248];
	int		err_msg_len;
	char	*err_msg;
	int		exception;
	int		try_level;
	int		script_line;
	int		err_no;
	char	Quot[4];		/* [2]:pGlobTable->err_msg 先頭追加フラグ,[3]:term_code */
	int 	options[MAX_OPTIONS];
#if 1	/* 2020.12.26 */
	ParList err_hist[2];
#endif
} GlobalCt;

typedef struct ScrPrCT {				/*** スクリプトテーブル ***/
	struct ScrPrCT	*preScCT;				/* 前のスクリプトテーブル */
	struct ScrPrCT	*nextScCT;				/* 次のスクリプトテーブル */
	ProcCT			*ProCT;					/* プロシージャテーブル   */
	VarTBL			*Vary;					/* 変数テーブル           */
	ONTBL			**ONCOND;				/* ＯＮ条件テーブル       */
	short			on_num_max;
	short			OnSelect;				/* ON condition selector  */
	Leaf			*TreeTop;				/* スクリプトの先頭リーフ */
	ConstantCt		*ConstCt;				/* 定数テーブル			*/
	uchar			ptype;
	char			pFlag;
	char			pFlag2;
	char			pFlag3;
	char			*pId;
	ConstantCt		*LeafConstCt;			/* 式コンパイル結果定数テーブル */
	tdtRbCtl		*pListImport;			/* Import済みファイル名のリスト */
	ProcCT			*CurProc;				/* カレントプロシージャテーブル */
	int				ScrGid;
	XHASHB			*ProcIndex;
	tdtObjHead		*Obj;					/* obj0 */
#if 1	/* 2022.5.21 */
	tdtREDIRECT		*redirect;
	char			*pading[4];
#else
	FILE			*stdio[4];				/* stdin,stdout,strerr,HereDoc_fp */
	char			*HereDoc_nm;
#endif
#if 1	/* 2022.4.19 */
	char			*fullname;
#else
	tdtRbCtl		*pListExport;			/* Export対象変数のリスト */
#endif
#if 1	/* 2021.18.25 */
	int				try_level_save;			/* save try_level when NOTRY */
#endif
} ScrPrCT;

typedef struct {
	long    mtime;
	long    ltime;
	int     refc;
	ScrPrCT scrct;
	char   *cpfullname;
	struct timeval rtime;	/* reg time */
} qLruScr;

typedef struct {
	int     LruOption;
	int     LruScrMax;
	int     LruCount;
	qLruScr *tpLruScr;
} tdtLruScrHead;

typedef struct CnCB {				/*** 定数管理ブロック *****/
	struct CnCB *nextCnCB;				/* 次定数管理ブロック	  */
	char		*BD;					/* 定数領域のアドレス	　*/
} CnCB;

typedef struct {					/* 文書検索管理テーブル	93.5.20 Koba */
	int		ViewNum;
	char	*ViewLip;
	int		ViewLen;
	int		ItemNum;
	char	*ItemLip;
	int		ItemLen;
	int		ExtNum;
	char	*ExtLip;
	int		ExtLen;
	char	*rPrmLp;
	int		PrmLen;
} SlmanTBL;

typedef struct ViewLine {		/* ビュー名称テーブルデータ　*/
	char	*ColSelCondition;		/* 検索条件式　*/
	char	ViewName[33];			/* ビュー名称　*/
	char	ALIASNAME[2];			/* 省略名　*/
	char	ObjFlag;				/* 対象フラグ　*/
} ViewLine;

typedef struct ViewTBL {		/* 検索ビュー名称テーブル */
	int			iItemNum;
	ViewLine	Line[26];			/* ビュー名称テーブルデータ */
} ViewTBL;

typedef struct ItemLine {		/* 項目テーブルデータ　*/
	int		ItemNumber;				/* 項目番号　*/
	int		DisplaySequence;		/* 表示順序 */
	short	DisplayDigit;			/* 表示桁数 */
	short	SummuryKind;			/*  */
	char	*ConditionData;			/* 条件データ */
	int		OrderNumber;
	char	OrderType;				/* Asc or Desc */
	char	ALIASNAME[2];			/* 省略名　*/
	char	ItemName[65];			/* 項目名称　*/
	char	AttrName[33];			/* アトリビュート名称 */
} ItemLine;

typedef struct ItemTBL {		/* 検索項目テーブル */
	int			iItemNum;
	ItemLine	Line[200];			/* 項目テーブルデータ */
} ItemTBL;

typedef struct ExtTBL {			/* 検索項目抽出テーブル */
	int			iItemNum;
	ItemLine	Line[200];			/* 項目テーブルデータ */
} ExtTBL;

typedef struct CatCondLine {	/* 結合条件テーブルデータ　*/
	int			CatRecNumber;		/* 結合識別番号 */
	char		ViewName[33];		/* ビュー名称　*/
	char		AttrName[33]; 		/* アトリビュート名称 */
} CatCondLine;

typedef struct CatCondTBL {		/* 結合条件テーブル */
	int			iItemNum;
	CatCondLine	Line[50];			/* 結合テーブルデータ */
} CatCondTBL;

typedef struct CLPRTBL {			/*** 制御ブロック ***/
	char             PrSt;				/* プロシージャ状況	*/
	char             ShtSt_unused;		/* terminate status	*/
	char             ScrSt;				/* スクリプト状況	*/
	char             SearchSt;			/* status flag for select process */
	int              iStackDepth;		/*  */
	char            *CmdPacketp;		/* コマンドパケット	*/
	char            *PrPacketp;			/* 実行中パケット	*/
	char            *WaitPacketp;		/* 待ちパケット		*/
	char            *WrPacketp;			/* 書き出しパケット */
	SearchResult	*SearchRsltF;		/* 検索結果構造体チェーンの先頭  */
	SearchResult	*SearchRsltC;		/* カレント検索結果構造体 */
	char             CurCmdId [4];		/* カレントコマンドＩＤ */
	int              MsgNum;			/* メッセージ番号	*/ 
	int              lInstanceHandle;	/* インスタント・ハンドル */
	short			 iThread;			/* スレッド番号	*/
	ushort			 usClassId;			/* クラス番号	*/
	int              PacketId;			/* パケットＩＤ */
	ListPacBody     *ListPBody;			/* */
	GlobalCt        *GlobCt;			/* システム変数管理 */
	ScrPrCT         *PrCTp;				/*スクリプト処理テーブル */
	VarTBL          *Vary;				/* 変数テーブル */
	ConstantCt		*ConstCt;			/* 定数テーブル */
	int				 SlstatusSW;		/* 文書検索状態スイッチ	93.5.20 Koba */
	SlmanTBL		*SlmanTblp;			/* 文書検索管理テーブル	93.5.20 Koba */
#ifdef NEW_VARTBL
	VarTBL_name		*gvnam;				/* 外部変数用 */
	char			*padding;
#else
	XHASHB			*pha_vnam;			/* 外部変数用 */
	tdtInfoParm		***pTBL_vnam;
#endif
	ushort			 usDbClassId;		/* DBクラスＩＤ   */
	ushort			 usDbProcId;		/* DBプロセスＩＤ */
	HASHB			*pha_fp;			/* Opened file pointer */
	struct timeval	 tScrTimeVal[4];	/* 0:Total 1: one thread */
	GXObject		**bxobj;
	ScrPrCT			*CurScr;			/* カレントスクリプト処理テーブル */
	ProcCT			*CurProc;			/* カレントプロシージャテーブル */
	XHASHB			*pha_env;			/* setenv name & value */
	int				 gid;
	tdtRbChain		*pha_gid;
	int				 myGid;
} CLPRTBL;

typedef struct {			/*** 共通制御ブロック (94.9.15)***/
	char	*dcHostId;		/* 自ホストＩＤ                  */
	char	*dbHostId;		/* ＤＢホストＩＤ       93.9.21  */
	int		iOwnIPAddr;		/* 自IPアドレス                  */
	INT4	dbHostAddr;		/* DBサーバＩＰアドレス 93.9.21  */
	char	*ScrPathp;		/* Script File Search Path 94.1.4 Koba */
	char	*CmdScriptp;	/* Command to Script File */
	uchar	cDataCode;		/* 日本語コード種別 94.7.30 Koba */
	uchar	ShtSt;			/* terminate status             */
	uchar	MultShtSt;		/* terminate status for Multi   */
	uchar	ucByteOrder;	/* 0/1:RISC/Intel */
	char	dbgopt[4];
	int		ProcessId;		/* プロセスＩＤ */
	int		iDbProcNum;		/* DBプロセス数 */
	ushort	usDbClassId;	/* DBクラスＩＤ */
	ushort	usDbProcId;		/* DBプロセスＩＤ */
	char	*pHomeDir;		/* User Home Directory */
	char	*pExtension;	/* Script File Name Extension  */
	char	Quot[4];
} CLCOMMON;

/*******************************/
/* グローバルエリア (cmdTable) */
/*******************************/
typedef struct cmdTable {	/*** コマンドテーブル ***/
	int    cmdid;				/* コマンド種別   */
	int    type;				/* コマンドタイプ */
	int    osize;
	char   *cmds;				/* コマンド文字列 */
} cmdTable;

/********************************/
/* 検索処理                     */
/********************************/
typedef struct {		/*** 項目情報 ***/
	char *pData;			/* データ */
	char  attr;				/* 属性   */
	int   len;				/* サイズ */
} qDataElm;
typedef qDataElm  *pDataElm ;

typedef struct {		/*** フレーム情報 ***/
	char     szFrameID[2];	/* フレーム ID */
	char     dummy[2];
	int      iTuple;		/* タプル数 */
	int      iNode;			/* ノード数 */
	int      field_1;		/* フィールド名 (GR only) */
	int      field_2;
	int      field_3;
	pDataElm pDataTbl;		/* 項目情報 */
} qFrameInfo;
typedef qFrameInfo *pFrameInfo ;

#define		STACKMAX	21		/* 実行中コマンド環境保存のＭＡＸ値 */

typedef struct {
	char *name;
	int  osize;
	int  attr;
	int  id;
} tdtExtValName;

typedef struct {
	char *name;
	short osize;
	short selector;
	short scid;
	short size;
	int   attr;
} qSubCommand;

typedef struct {
	char *name;
	int  id;
} tdtException;

typedef struct {		/*** 関数テーブル ***/
	char *name;
	short mpara;
	short ope;
	uchar kubun;
	uchar reta;
	uchar arg_kbn;
	uchar ret_kbn;
	int  (*func)();
} qOpeTable;

typedef struct {
	char *str_num;
	char *str1;
	char *str2;
	short rsv;
	uchar rad;
	uchar offset;
} tdtCharAdd;

typedef struct {
	char it_id;
	uchar it_attr;
	char it_rsv[2];
	int  it_nm;
	int  it_ix;
	int  it_interval;
	tdtInfoParm *it_pInfo;
	XHASHB *it_xhp;
	tdtInfoParm ***it_pTBL;
	tdtArrayIndex *it_pIndex;
	tdtRbCtl *it_pCt;
	tdtInfoParm *it_cur;
} tdtIterate;

typedef struct {
	tdtRbCtl *itc_stack;
	tdtIterate *itc_pIter;
#if 1
	MCAT2 *itc_circ_ref;
#else
	HASHB *itc_circ_ref;
#endif
	int itc_max_layer;
	int itc_layer;
} tdtIterate_ctl;

#endif /* INC_CLLOCAL */
