背景:
阅读文章

批处理的Update

[日期:2007-05-11] 来源:  作者: [字体: ]

在MUD中加强功能的update命令


作者:文月  

公用的命令update的功能很差劲,只能一个一个文件地update
在有些需要大量update的情况下使用update很麻烦
这个问题在upgrade mudos之后更加严重,
因为有大量的程序不能不做任何修改运行在新的MUDOS之上。  
有不少MUD自己都已经改写了UPDATE程序,


能够一次更新整个目录但是由于现在MUD站之间的现状,
往往这样的小程序都作为了MUD的机密文件,不肯公开。
找人要不到,没办法,只好自己写了,
我把ls.c和原始的update.c 两个程序
放在一起加了点语句,花了几分钟改了改,
合成了下面这个upddir.c,下面这个程序可以更新整个目录。
希望对还没有写这个功能的WIZ们有点用处。

// upddir.c
//这个命令可以用来更新某个目录下以及所有子目录下的文件
//命令创建者win@SXTX ,email:wen_yue@163.net

#include "/doc/help.h" inherit F_CLEAN_UP;
int updatefile(object me,string file);
int main(object me, string arg)
{
int i, j;
string dir;
mixed *file;                 

seteuid( geteuid(me) );
dir = resolve_path(me->query("cwd"), arg);
if( file_size(dir)==-2 && dir[strlen(dir)-1] != '/' ) dir += "/";
file = get_dir(dir, -1);
if( !sizeof(file) )
{if (file_size(dir) == -2)
return notify_fail("目录是空的。\n");
else
return notify_fail("没有这个目录。\n"); }
i = sizeof(file); while(i--)
{
if (file[i][1]==-2) file[i][0] += "/";
}
write("目录:" + dir + "\n");
if (sizeof(file))
for(i=0, j = sizeof(file); i < j; i++) {
                  if (file[i][1]!=-2 && sscanf(file[i][0], "%*s.c") 
                     && file[i][0][strlen(file[i][0])-1]=="c"[0]
                     && file[i][0][strlen(file[i][0])-2]=="."[0])
                  updatefile(me,dir+file[i][0]); 
                  else if (file[i][1]==-2)
                  call_other(__FILE__,"main", me,dir+file[i][0]);
                 } else write("    没有任何档案。\n"); write("\n");
    return 1; }

int updatefile(object me,string file)
{  object obj,*inv;
   int i;    
   string err; me->set("cwf", file);

if (obj = find_object(file)) {
if( obj==environment(me) ) {
if( file_name(obj)==VOID_OB )
return notify_fail("你不能在 VOID_OB 里重新编译 VOID_OB。\n");
inv = all_inventory(obj);
i = sizeof(inv);
while(i--)
if( userp(inv[i]) )
inv[i]->move(VOID_OB, 1);
else inv[i] = 0;
}
destruct(obj);
}
if (obj) return notify_fail("无法清除旧程式码。\n");
    write("重新编译 " + file + ":");
err = catch( call_other(file, "???") );
if (err) printf( "发生错误:\n%s\n", err );
else { write("成功!\n");
if( (i=sizeof(inv)) && (obj = find_object(file)))
{ while(i--)
if( inv[i] && userp(inv[i]) )
inv[i]->move(obj, 1); } } }

int help(object me) {
write(@HELP 指令格式: upddir [<路径名>]  
将目录下所有的子目录及档案, 如果没有指定目录, 则使用当前目录  
范例: 'upddir /adm' 会将所有位於根/adm目录下的档案编译更新.  
HELP );
return 1; } 
-- 
 

尊重作者 转载请注明出处52mud.com

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论