Nebula2探秘附件:nutildef与nkernelinfo的代码

nutildef.h中主要定义了运行Nebula2程序所需要的最小依赖以及简化声明和使用Nebula2对象的工具宏,代码如下:

/****************************************************************************/
/*Nebula2-TutorialUtils*/
/*nKernelInfo-Nebula2实用工具宏及静态库*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce

///----------------------------------------------------------------------------
///+必要的链接库
#ifdefKS_STATICLINK_NEBULA2

#pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"dxguid.lib")
#pragmacomment(lib,"dxerr9.lib")
#pragmacomment(lib,"d3d9.lib")
#pragmacomment(lib,"d3dx9d.lib")
#pragmacomment(lib,"dinput8.lib")

#pragmacomment(lib,"ogg_d.lib")
#pragmacomment(lib,"theora_d.lib")
#pragmacomment(lib,"sqlite_d.lib")

#pragmacomment(lib,"d_microtcl.lib")
#pragmacomment(lib,"d_nkernel.lib")
#pragmacomment(lib,"d_nnebula.lib")
#pragmacomment(lib,"d_ntoollib.lib")
#pragmacomment(lib,"d_ngui.lib")
#pragmacomment(lib,"d_ndinput8.lib")
#pragmacomment(lib,"d_ndirect3d9.lib")

#endif
///-必要的链接库
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+声明Nebula2对象工具宏
///声明使用指定的Module
#definenNebulaUseModule(MODULE)
externvoid*n_new_##MODULE(void);
externbooln_init_##MODULE(nClass*,nKernelServer*);

///将指定Module添加到KernelServer
#definenNebulaAddModule(MODULE)
nKernelServer::Instance()
->AddModule(#MODULE,
n_init_##MODULE,n_new_##MODULE);

///声明为Nebula2Module
#definenNebulaModule(CLASS,MODULE,BASEMODULENAME)
externbooln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer);
externvoid*n_new_##MODULE();
booln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer){
clazz
->SetProperName(#MODULE);
clazz
->SetInstanceSize(sizeof(CLASS));
kernelServer
->AddClass(BASEMODULENAME,clazz);
returntrue;
};
void*n_new_##MODULE(){returnn_new(CLASS());};

///命令初始化函数名
#definenNebulaScriptInitCmds(MODULE)n_initcmds_##MODULE

///声明为Nebula2脚本Module
#definenNebulaScriptModule(CLASS,MODULE,BASEMODULENAME)
externbooln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer);
externvoid*n_new_##MODULE();
externvoidn_initcmds_##MODULE(nClass*);
booln_init_##MODULE(nClass*clazz,nKernelServer*kernelServer){
clazz
->SetProperName(#MODULE);
clazz
->SetInstanceSize(sizeof(CLASS));
kernelServer
->AddClass(BASEMODULENAME,clazz);
n_initcmds_##MODULE(clazz);
returntrue;
};
void*n_new_##MODULE(){returnn_new(CLASS());};

///-声明Nebula2对象工具宏
///----------------------------------------------------------------------------

nkernelinfo类主要是对第3章代码的整理,目前支持察看Nebula2的Class列表和当前NOH中的对象两项功能。
nkernelinfo.h代码如下:

/****************************************************************************/
/*Nebula2-TutorialUtils*/
/*nKernelInfo-Nebula2内核信息调试器*/
/*author:happykevins*/
/****************************************************************************/
#pragmaonce
#include
"kernel/nkernelserver.h"
#include
"util/nstack.h"
#include
"util/nhashlist.h"

//使用标准输出流(否则输出到Nebula2的日志系统)
#ifdefKS_USE_STDOUT
#defineks_printprintf
#else
#defineks_printn_printf
#endif

classnKernelInfoHelper:publicnRoot
{
public:
///构造nKernelInfoHelper
nKernelInfoHelper(nKernelServer*_ks=nKernelServer::Instance());
///设置KernelServer实例
voidSetKernelServer(nKernelServer*_ks);
///将指定NOH分支的当前信息输出到Nebula日至系统
voidLogNOH(constchar*szRootPath);
///将当前的类列表输出到Nebula日至系统
voidLogCLS();

protected:
nKernelServer
*ks;
};

nkernelinfo.cpp代码如下:

//nkernelinfo.cpp
#pragmawarning(push)
#pragmawarning(disable:42674244)

#include
"nkernelinfo.h"
#include
"nutildefs.h"

///声明为Nebula2脚本支持类
nNebulaScriptModule(nKernelInfoHelper,nkernelinfohelper,"nroot");

///----------------------------------------------------------------------------
///+CommonSection
///

///构造nKernelInfoHelper
nKernelInfoHelper::nKernelInfoHelper(nKernelServer*_ks)
:ks(_ks)
{
}

///设置KernelServer实例
voidnKernelInfoHelper::SetKernelServer(nKernelServer*_ks)
{
this->ks=_ks;
}

///将指定NOH分支的当前信息输出到Nebula日至系统
voidnKernelInfoHelper::LogNOH(constchar*szRootPath)
{
n_assert(ks);
n_assert(szRootPath);

nRoot
*pRoot=ks->Lookup(szRootPath);

if(!pRoot)
{
ks_print(
"--NONE:%s---- ",szRootPath);
return;
}

//内核加锁
ks->Lock();

//打印根节点NOH名
if(pRoot->GetParent())
{
ks_print(
"%s ",pRoot->GetFullName().Get());
}
else
{
ks_print(
"%s ",pRoot->GetName());
}

//打印所有子节点
if(pRoot->GetHead())
{
//层次栈
//在开始时将根节点入栈
nStack<nRoot*>deepStack;
deepStack.Push(pRoot
->GetHead());

//遍历树
do
{
//获得当前栈顶元素
nRoot*obj=deepStack.Pop();

//打印该元素NOH名
if(obj->GetParent())
{
ks_print(
"%s ",obj->GetFullName().Get());
}
else
{
ks_print(
"%s ",obj->GetName());
}

//兄弟节点入栈
if(obj->IsLinked()&&obj->GetSucc())
{
deepStack.Push(obj
->GetSucc());
}

//第一个子节点入栈
if(obj->GetHead())
{
deepStack.Push(obj
->GetHead());
}

}
while(!deepStack.IsEmpty());
}

//内核解锁
ks->Unlock();
}

///将当前的类列表输出到Nebula日至系统
voidnKernelInfoHelper::LogCLS()
{
n_assert(ks);

//内核加锁
ks->Lock();

//获得Class列表
constnHashList*classList=ks->GetClassList();
nHashNode
*node=(nClass*)classList->GetHead();

//遍历输出Class列表
do
{
nClass
*cls=(nClass*)node;
ks_print(
"%s ",cls->GetName());
node
=node->GetSucc();
}
while(node);

//内核解锁
ks->Unlock();
}

///
///-CommonSection
///----------------------------------------------------------------------------

///----------------------------------------------------------------------------
///+ScriptSection
///

///LogCLS的脚本支持
staticvoidn_logcls(void*slf,nCmd*cmd);
///LogNOH的脚本支持
staticvoidn_lognoh(void*slf,nCmd*cmd);

voidnNebulaScriptInitCmds(nkernelinfohelper)(nClass*cl)
{
cl
->BeginCmds();
cl
->AddCmd("v_logcls_v",'LCLS',n_logcls);
cl
->AddCmd("v_lognoh_s",'LNOH',n_lognoh);
cl
->EndCmds();
}

staticvoidn_logcls(void*slf,nCmd*cmd)
{
nKernelInfoHelper
*self=(nKernelInfoHelper*)slf;
self
->LogCLS();
}

staticvoidn_lognoh(void*slf,nCmd*cmd)
{
nKernelInfoHelper
*self=(nKernelInfoHelper*)slf;
constchar*root=cmd->In()->GetS();
self
->LogNOH(root);
}

///
///-ScriptSection
///----------------------------------------------------------------------------
#pragmawarning(pop)
-The End-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值