/*
 * $Id: m_actor_dlftbls.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 *
 *
 */

#if !defined(typedef_struct_Actor_profile)
#include "m_actor.h"		/* Actor_profile */
#endif /* !defined(typedef_struct_Actor_profile) */
    
#ifndef M_ACTOR_DLFTBLS_H
#define M_ACTOR_DLFTBLS_H

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

/*
 * アクタープロファイルクラス定義
 */
typedef struct {
    u32 SegmentRomStart;	/* _nameSegmentRomStart */
    u32 SegmentRomEnd;		/* _nameSegmentRomEnd */
    char *SegmentStart;		/* _nameSegmentStart */
    char *SegmentEnd;		/* _nameSegmentEnd */
    char *allocp;		/* セグメントを配置した実際のアドレス */
    Actor_profile *profile;	/* profileの仮想アドレス */
#ifdef USE_ACTOR_NAME_TABLE
    char *segname;		/* セグメント名（デバッグ用） */
#else
    char *__segname;		/* 構造体のサイズが変わらないように */
#endif /* USE_ACTOR_NAME_TABLE */
    u16 flags;			/* bit0:解放可能 */
    s8  clients;	/* クライアント数
			   (同じプログラムを使うアクター数:プログラムを解放していいかで使う) */
    u8  status;			/* bit0:ロード中 bit1:常駐 */
} Actor_profile_dlftbl;
typedef Actor_profile_dlftbl DLFTBL_ACTOR;

/*
 * セグメント名取得
 */
#ifdef USE_ACTOR_NAME_TABLE
#define actor_dlftbl_GetSegName(t) ((t)->segname ? (t)->segname : "")
#else
#define actor_dlftbl_GetSegName(t) ((void)(t), "")
#endif

typedef enum {
#define decl(name) ACTOR_DLF_##name,
#define decl0(name1, name2) _filler_ACTOR_DLF_ ## name1 ## _filler_,
#define decl1(name1, name2) decl(name1)
#define decl2(name1, name2) decl(name1)
#define decl3(name1, name2) decl(name1)
#define decl4(name1, name2) decl(name1)
#define decl5(name1, name2) decl(name1)
#include "m_actor_dlftbls.decl"
#undef decl
#undef decl0
#undef decl1
#undef decl2
#undef decl3
#undef decl4
#undef decl5
    ACTOR_DLF_MAX,
    ACTOR_DLF_NO_AC_e = ACTOR_DLF_MAX
} actor_dlftbls_e;

/*
 * アクタープロファイルのポインタを取得
 */
#define actor_dlftbl_profile(actor_dlftbl) \
(((actor_dlftbl)->allocp == NULL) ? ((actor_dlftbl)->profile) : \
 ((actor_dlftbl)->profile) - ((actor_dlftbl)->SegmentStart) + ((actor_dlftbl)->allocp))

/*
 * グローバル変数宣言
 */
extern unsigned int actor_dlftbls_num; /* actor_dlftblsの要素数 */
extern DLFTBL_ACTOR actor_dlftbls[];

/*
 * グローバル関数宣言
 */
/*
 * テーブル情報表示
 * （デバッグ用）
 */
extern void
actor_dlftbls_show_info(void);
/*
 * 初期化
 */
extern void
actor_dlftbls_init(void);
/*
 * 後始末
 */
extern void
actor_dlftbls_cleanup(void);


#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif /* M_ACTOR_DLFTBLS_H */
