- 积分
- 428
- 明经币
- 个
- 注册时间
- 2002-7-25
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2003-2-19 16:35:00
|
显示全部楼层
請各位看看原程序......
//以下以SDS或sds開頭的函數、變量、常量是和ads相應的,如sds_resbuf=resbuf,sds_link=ads_link,執行後,在指令行會有“mycmdnil"
//-----------------------------------------------------------------------------
#define ARRAYELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
struct func_def
{
char *func_name;
int (*func) (struct sds_resbuf *);
};
int mycmd_main(resbuf *rb);
static struct func_def func_table[] =
{
{"c:mycmd", mycmd_main}
};
int main(int, char **);
int invokefun(void);
int funcload(void);
int main(int argc, char** argv)
{
short scode = RSRSLT; // Normal result code (default)
int stat;
char errmsg[80];
ads_init(argc, argv); // Open communication with lisp
for ( ;; )
{ // Request/Result loop
if ((stat = sds_link(scode)) < 0)
{
sprintf(errmsg, "Templt: bad status from sds_link() = %d\n", stat);
sds_printf(errmsg);
sds_exit(-1);
}
scode = RSRSLT; // Reset result code
switch (stat)
{
case RQXLOAD: // Load & define functions
scode = funcload() == RTNORM ? RSRSLT : RSERR;
break;
case SDS_RQXUNLD:
break;
case RQSUBR: // Handle external function requests
scode = invokefun() == RTNORM ? RSRSLT : RSERR;
break;
case SDS_RQSAVE:
break;
case SDS_RQEND:
break;
case SDS_RQQUIT:
break;
case SDS_RQCFG:
break;
case SDS_RQHUP:
break;
case SDS_RQXHELP:
break;
default:
break;
}
}
return(1);
}
static int funcload()
{
short i;
for (i = 0; i < ARRAYELEMENTS(func_table); i++)
{
if (!ads_defun(func_table.func_name, i))
return RTERROR;
}
return RTNORM;
}
static int invokefun()
{
struct sds_resbuf *rb;
int val;
if ((val = sds_getfuncode()) < 0 || val >= ARRAYELEMENTS(func_table))
{
sds_fail("收到不存在的函數代碼.");
return RTERROR;
}
rb = sds_getargs();
val = (*func_table[val].func)(rb);
sds_relrb(rb);
return val;
}
//////////////////////////功能函數//////////////////////////////////
int mycmd_main(resbuf *rb)
{
ads_alert("in");
return RTNORM;
} |
|