Wei's profilew3ishi's blogPhotosBlogLists Tools Help

Blog


    3/7/2007

    lq2v1基本完成!

    lq2v1基本完成!这将近一年的时间,经历了很多事情,甚至走了一些偏路,比如去了不该去的地方。不过,一切都过去了,就当是经验吧:)
    从技术角度讲,真的不知道John Carmack从Doom以来都经历了哪些“磨难”。当你真正的深入进去,你才发现有很多问题需要解决,有些甚至是你从来都没有想过的,经常会另你束手无策。过几天lq2v1完善并完成它的使命后,我会尝试新的技术,毕竟在相关文档比较稀缺的情况下,quake2的很多技术细节还是需要看代码才能理解,有这时间不如去思考新的技术以及架构。非常感谢John  Carmack 以及id software能非常无私的公开他们的代码,他们能提供的信息已经非常多了!
    10/25/2006

    关于gnu rx-1.5的bug问题。

    去年12月份完成regexplib,主要实现思想与gnu rx-1.5一致,但比gnu rx-1.5的实现要简单(以搞清原理为主要目的,没有考虑其他因素),主要是在nfa模拟那部分。在这过程中,发现了一些bug,给Tom Lord写信,可能是因为地址错误的原因,没有得到答复。前几天发现了Tom Lord的邮件地址,询问了这个问题,并得到答复。原来gnu rx-1.5已经不是最新版本了,最新的rx包含在gnu arch(http://www.gnuarch.org/)这个项目中,新版本已经修正了很多bug,并且提高了性能。Tom也不知道为什么gnu.org上为什么还要发布rx-1.5这个版本。以下是与Tom交流的部分内容,我的英语不是很好,好在他看懂了我的意思:
     
    收件人: shi wei <w3ishi@gmail.com>
    日期: 2006-10-21 上午3:16
    主题: Re: hi, Mr lord, A bug about gnu rx1.5?
    I'm not sure why the GNU project still distributes rx-1.5.   It is very old and, yes, I know it has bugs.   The most recent versions of Rx are much better: fast and much more accurate.   They are not distributed as a separate project but you can find a copy in GNU Arch.

    I'm sorry your time got sucked into rx-1.5 -- the FSF should not be distributing it.

    I am curious about your implementation.

    If you want to join the GNU Arch project, the best thing to do is probably to join the mailing list and introduce yourself.

    shi wei wrote:
    Hello, Mr load:
    In this year earlier, I was learn about regular expression and your source code "gnu rx-1.5". Through your idea I wrote my own regular expression lib. But when I learn your source code, I found a bug in it. I sent you a email( lord@gnu.org) about this bug, but no write back, I think you have change your email adress. Today I found your email adress"lord@emf.net", and try whether you can receive my email. The bug detail is for example use this kind of string and pattern:

    /////////////////////////////////////////////////////////////////////////////////////
    char *string = "@john-doe.i.am.com";
    char *pattern = "@([A-Za-z0-9]*)(([\\.\\-]*[a-zA-Z0-9]*)*)\\.([A-Za-z]{2,3})";

    // or

    char *string = "aaa";
    char *pattern = "((a*)*)(\\1)";

    The programe may fall in a dead loop. The logical is:
    /////////////////////////////////////////////////////////////////////////////////////

    case r_concat:
           {
      switch (solns->step)
        {
          enum rx_answers concat_stat;
        case 1:
          solns->split_guess = solns->end;
    #if 0
          solns->split_guess = ((solns->end - solns->start) > RX_MANY_CASES
           ? rx_best_end_guess (solns,
                  solns->exp->params.pair.left, solns->end)
           : solns->end);
    #endif

        concat_split_guess_loop:
          solns->left = rx_make_solutions (solns->regs,
               solns->verse,
               solns->exp->params.pair.left,
               solns->subexps,
               solns->cset_size,
               solns->start,
               solns->split_guess,
               solns->vmfn,
               solns->contextfn,
               solns->closure);
          if (!solns->left)
            {
       solns->step = -1;
       return rx_bogus;
            }
          solns->step = 2;

        case 2:
        concat_try_next_left_match:

          concat_stat = rx_next_solution (solns->left);

          if (concat_stat != rx_yes)
            {
    new_tag_i_add:
       rx_free_solutions (solns->left);
       rx_free_solutions (solns->right);
       solns->left = solns->right = 0;
       solns->split_guess = solns->split_guess - 1;
    #if 0
       solns->split_guess = ((solns->split_guess - solns->start) > RX_MANY_CASES
               ? rx_best_end_guess (solns,
               solns->exp->params.pair.left,
               solns->split_guess - 1)
               : solns->split_guess - 1);
    #endif
       if (solns->split_guess >= solns->start)
         goto concat_split_guess_loop;
       else
         {
           solns->step = -1;
           return concat_stat;
         }
            }
          else
            {
       solns->step = 3;
       /* fall through */
            }

        case 3:
          solns->right = rx_make_solutions (solns->regs,
                solns->verse,
                solns->exp->params.pair.right,
                solns->subexps,
                solns->cset_size,
                solns->split_guess,
                solns->end,
                solns->vmfn,
                solns->contextfn,
                solns->closure);
          if (!solns->right)
            {
       rx_free_solutions (solns->left);
       solns->left = 0;
       solns->step = -1;
       return rx_bogus;
            }

          solns->step = 4;
          /* fall through */

        case 4:
        /* concat_try_next_right_match: */

          concat_stat = rx_next_solution (solns->right);
          if (concat_stat == rx_yes)
            {
       solns->final_tag = solns->right->final_tag;
       return concat_stat;
            }
          else if (concat_stat == rx_no)
            {
       rx_free_solutions (solns->right);
       solns->right = 0;
       solns->step = 2;
       goto concat_try_next_left_match;
            }
          else /*  concat_stat == rx_bogus */
            {
       rx_free_solutions (solns->left);
       solns->left = 0;
       rx_free_solutions (solns->right);
       solns->right = 0;
       solns->step = -1;
       return concat_stat;
            }
        }


     In case 4, if soln->right->start == soln->right->end, and soln->right is not match null, it will go to concat_try_next_left_match,
    but if concat_try_next_left_match can match a again the string, it will not solns->split_guess--, so it will come to  concat_stat = rx_next_solution (solns->right); again...
     In my opinion, if case 4 rx_next_solution return rx_no, it have to estimate solns->right->regexp, if it can't nullable and solns->right->start == solns->right->end  goto new_tag_i_add.
     I am a newer in regular expression program, so I don't know if it is a bug? And my English is not good, can you understand me?
     
     A syntax tree may lead error, like this:


                  r_concat
                  /  \
             r_parens    r_cset
                  /
                 r_star
                 /
                r_parens
                /
               r_concat
               / \
          r_star r_star
              /   \
        r_cset   r_cset

    I want join some gnu project, such as http://www.gnuarch.org/revc/index.html, can you give me some idea about how can I start?
    Expect your write back, and thank you very much!
     
    ShiWei
    2006-10-20
    7/23/2006

    lq2v1的几张截图。

    lq2(like quake2),呵呵,名不副实,比quake2差远了,quake2的技术就是在10年后的今天来看也并不过时,至少这是我的愚见。贴几张用我的“引擎“跑quake2中base1.map(第一关)的截图。没有光照,只是稍微调制了一下色彩,所以看起来很难受,最好把亮度和对比度开到最大,否则看见的只是一片漆黑。另外,纹理的坐标也不对,先不调了,能看出个模样就行了,毕竟我不是要做quake2,而是...
    6/22/2006

    已经与quake2的.map兼容了!

        已经与quake2的.map, .wal...兼容了!这意味着我已经可以完全使用quake2的地图在我自己的引擎上运行了!也意味着没有任何外界因素可以阻拦我了,除非是我自己放弃!一直以来都有一个问题困扰着我,那就是我身边没有美工,没有人可以为我做大场景的地图和贴图。所以,从一开始我的目标就是尽量的与quake2的文件兼容,包括地图编辑器的操作也都尽量与Worldcraft相同,现在看来,当初定的路线是完全正确的。稍后,我就可以说出我早就想说,但一直没有底气说的那句话了:"quake2,我来了!" 接下来的工作重点会放在引擎上面:碰撞检测,bsp+portal+pvs,光照,阴影...(用软件实现还是opengl呢?如果是炫耀,还是软件实现厉害,如果为了效果好,速度快,还是乖乖的用opengl吧,cpu干这个比不过gpu的^_^) 至于地图编辑器,还是先放放吧,既然已经和worldcraft兼容了,还是先用它吧,不过,早晚也要完善的。
    4/8/2006

    regexplib v0.11

    regexplib v0.11
    主要修正了interval{m,n}的一个bug。
    我没有可以上传文件的空间,所以放到了www.linuxforum.net上。
    4/3/2006

    World Builder0.1

    World Builder项目,3D地图编辑器。界面,操作,文件格式,大部分和Worldcraft兼容,图中显示的是quake2中的一张地图。
    这个项目将来主要为md引擎服务。个人认为,如果做完整的引擎,就必须要有一个好用的地图编辑器,否则没有任何意义,地图编辑器使用他人的并不是长久之计,所以开发了这个项目。

    正则表达式库

    前几天写的一个正则表达式库,与gnu rx, regexp 的regcomp(&reg, regstr, REG_EXTENDED)兼容。
    代码下载地址:
    具体信息可以在readme.txt中找到。