Menu

Bug found - keyword appears at line beginning

2008-07-26
2013-04-05
  • Thanassis Tsiodras

    I use webcpp to automatically color the code snippets in my site...
    and I found out that webcpp has a bug when a keyword appears
    at the beginning of a line

    (I have some Python code, where for example the functions are
    defined with a "def" starting at the beginning of the line)

    If you check the code in Engine.cpp, (version 0.8.4), you'll see
    that when locating a keyword, parseKeys() is calling isKey() with

    if(isKey(index-1, (index) + keys[i].size())) {

    If the keyword appears at the beginning of the line (e.g. "def" in
    Python code), then this causes member isKey to operate on
    buffer[-1]...

    I did this patch which seems to correct the problems with Python code...

    Regards,
    Thanassis.

    --- engine.cpp  Mon Jan  5 02:52:47 2004
    +++ engine.cpp.fixed    Sat Jul 26 20:17:41 2008
    @@ -697,16 +697,23 @@
    // asserts word boundaries for keywords ---------------------------------------
    bool Engine::isKey(int before, int after) const {

    -       if(buffer[before] == '#')   {return false;}
    -       if(buffer[before] == '_')   {return false;}
    -       if(buffer[after]  == '_')   {return false;}
    -       if(isalnum(buffer[before])) {return false;}
    -       if(isalnum(buffer[after]))  {return false;}
    +       if (before>=0 && before<buffer.size()) {
    +               if(buffer[before] == '#')   {return false;}
    +               if(buffer[before] == '_')   {return false;}
    +       }
    +       if (after>=0 && after<buffer.size())
    +               if(buffer[after]  == '_')   {return false;}
    +       if (before>=0 && before<buffer.size())
    +               if(isalnum(buffer[before])) {return false;}
    +       if (after>=0 && after<buffer.size())
    +               if(isalnum(buffer[after]))  {return false;}

    -       if(ispunct(buffer[before]) isspace(buffer[before])) {
    +       if (before>=0 && before<buffer.size())
    +           if(ispunct(buffer[before]) isspace(buffer[before])) {
    +               if (after>=0 && after<buffer.size())
    +                   if(ispunct(buffer[after]) isspace(buffer[after])) {
                           return true;
    -               }
    +                   }
           }
           return true;
    }
     
    • Thanassis Tsiodras

      Sorry, the patch apparently didn't survive...
      Enclosing it now in a preformatted section

      <pre>
      --- engine.cpp  Mon Jan  5 02:52:47 2004
      +++ engine.cpp.fixed    Sat Jul 26 20:17:41 2008
      @@ -697,16 +697,23 @@
      // asserts word boundaries for keywords ---------------------------------------
      bool Engine::isKey(int before, int after) const {

      -       if(buffer[before] == '#')   {return false;}
      -       if(buffer[before] == '_')   {return false;}
      -       if(buffer[after]  == '_')   {return false;}
      -       if(isalnum(buffer[before])) {return false;}
      -       if(isalnum(buffer[after]))  {return false;}
      +       if (before&gt;=0 &amp;&amp; before&lt;buffer.size()) {
      +               if(buffer[before] == '#')   {return false;}
      +               if(buffer[before] == '_')   {return false;}
      +       }
      +       if (after&gt;=0 &amp;&amp; after&lt;buffer.size())
      +               if(buffer[after]  == '_')   {return false;}
      +       if (before&gt;=0 &amp;&amp; before&lt;buffer.size())
      +               if(isalnum(buffer[before])) {return false;}
      +       if (after&gt;=0 &amp;&amp; after&lt;buffer.size())
      +               if(isalnum(buffer[after]))  {return false;}

      -       if(ispunct(buffer[before]) isspace(buffer[before])) {
      +       if (before&gt;=0 &amp;&amp; before&lt;buffer.size())
      +           if(ispunct(buffer[before]) isspace(buffer[before])) {
      +               if (after&gt;=0 &amp;&amp; after&lt;buffer.size())
      +                   if(ispunct(buffer[after]) isspace(buffer[after])) {
                              return true;
      -               }
      +                   }
              }
              return true;
      }
      </pre>
       
    • Thanassis Tsiodras

      Last try: uuencoded patch... If this doesn't work, type it
      yourself... (stupid web interfaces!)

      begin 644 webcpp-0.8.4-src_webcpp_engine.cpp.patch
      M+2TM(&5N9VEN92YC<'`)36]N($IA;B`@-2`P,CHU,CHT-R`R,#`T"BLK*R!E
      M;F=I;F4N8W!P+F9I>&5D"5-A="!*=6P@,C8@,C`Z,3<Z-#$@,C`P.`I`0"`M
      M-CDW+#$V("LV.3<L,C,@0$`*("\O(&%S<V5R=',@=V]R9"!B;W5N9&%R:65S
      M(&9O<B!K97EW;W)D<R`M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
      M+2TM+2TM+2T*(&)O;VP@16YG:6YE.CII<TME>2AI;G0@8F5F;W)E+"!I;G0@
      M869T97(I(&-O;G-T('L*(`HM"6EF*&)U9F9E<EMB969O<F5=(#T]("<C)RD@
      M("![<F5T=7)N(&9A;'-E.WT*+0EI9BAB=69F97);8F5F;W)E72`]/2`G7R<I
      M("`@>W)E='5R;B!F86QS93M]"BT):68H8G5F9F5R6V%F=&5R72`@/3T@)U\G
      M*2`@('MR971U<FX@9F%L<V4[?0HM"6EF*&ES86QN=6TH8G5F9F5R6V)E9F]R
      M95TI*2![<F5T=7)N(&9A;'-E.WT*+0EI9BAI<V%L;G5M*&)U9F9E<EMA9G1E
      M<ETI*2`@>W)E='5R;B!F86QS93M]"BL):68@*&)E9F]R93X],"`F)B!B969O
      M<F4\8G5F9F5R+G-I>F4H*2D@>PHK"0EI9BAB=69F97);8F5F;W)E72`]/2`G
      M(R<I("`@>W)E='5R;B!F86QS93M]"BL)"6EF*&)U9F9E<EMB969O<F5=(#T]
      M("=?)RD@("![<F5T=7)N(&9A;'-E.WT**PE]"BL):68@*&%F=&5R/CTP("8F
      M(&%F=&5R/&)U9F9E<BYS:7IE*"DI"BL)"6EF*&)U9F9E<EMA9G1E<ET@(#T]
      M("=?)RD@("![<F5T=7)N(&9A;'-E.WT**PEI9B`H8F5F;W)E/CTP("8F(&)E
      M9F]R93QB=69F97(N<VEZ92@I*2`**PD):68H:7-A;&YU;2AB=69F97);8F5F
      M;W)E72DI('MR971U<FX@9F%L<V4[?0HK"6EF("AA9G1E<CX],"`F)B!A9G1E
      M<CQB=69F97(N<VEZ92@I*0HK"0EI9BAI<V%L;G5M*&)U9F9E<EMA9G1E<ETI
      M*2`@>W)E='5R;B!F86QS93M]"B`*+0EI9BAI<W!U;F-T*&)U9F9E<EMB969O
      M<F5=*2!\?"!I<W-P86-E*&)U9F9E<EMB969O<F5=*2D@>PHM"0EI9BAI<W!U
      M;F-T*&)U9F9E<EMA9G1E<ETI('Q\(&ES<W!A8V4H8G5F9F5R6V%F=&5R72DI
      M('L**PEI9B`H8F5F;W)E/CTP("8F(&)E9F]R93QB=69F97(N<VEZ92@I*2`*
      M*PD@("`@:68H:7-P=6YC="AB=69F97);8F5F;W)E72D@?'P@:7-S<&%C92AB
      M=69F97);8F5F;W)E72DI('L**PD):68@*&%F=&5R/CTP("8F(&%F=&5R/&)U
      M9F9E<BYS:7IE*"DI"BL)"2`@("!I9BAI<W!U;F-T*&)U9F9E<EMA9G1E<ETI
      M('Q\(&ES<W!A8V4H8G5F9F5R6V%F=&5R72DI('L*(`D)"7)E='5R;B!T<G5E
      F.PHM"0E]"BL)"2`@("!]"B`)?0H@"7)E='5R;B!T<G5E.PH@?0H`
      `
      end

       
    • el_cubano

      el_cubano - 2008-08-02

      This bug was also reported in the Debian package here: http://bugs.debian.org/493131

       

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.