<div dir="ltr">I ran into this bug many years ago - but back then I either assumed or got told that the first rule must not be != but has to be plain =.<div>However I think it simply did not work instead of throwing a stack overflow.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 7 August 2017 at 22:43, Steve Ratcliffe <span dir="ltr"><<a href="mailto:steve@parabola.me.uk" target="_blank">steve@parabola.me.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi<br>
<br>
Every now and again, there is a bug report on a style rule that gives<br>
an error when it shouldn't.  The most recent from Mike Baggaley,<br>
included a case where the rule was accepted but the result was<br>
incorrect.<br>
<br>
I wrote a little program to generate random rules and test them using<br>
the style tester.<br>
<br>
This showed that there were many rules that should be accepted that<br>
are not and worse there are cases where the wrong result is given.<br>
<br>
Worst of all this simple rule:<br>
<br>
   a>=1 & (a=1 | b~2) [0x2]<br>
<br>
(and many others) crash mkgmap with a StackOverflowError.  I'm<br>
surprised that no-one has found that.  Perhaps they have and it just<br>
hasn't been reported.<br>
<br>
An example of a rule that is accepted but doesn't work is:<br>
<br>
   (a!=1 | b~2) & a<2 & a>=2 [0x2]<br>
<br>
This matches (with trunk) with a way with tags a=2 and b=2<br>
but it should not.<br>
<br>
So not very complex rules fail.  There are also vast number of rules<br>
that involve using not (!) such as !(highway=service & ...) that are<br>
not accepted or do not work.  Probably not many styles have many such<br>
rules though.<br>
<br>
So I re-wrote and simplified the code and the result is<br>
on the expr branch.<br>
<br>
There is also a new feature that was needed to help make it<br>
work.  There is now a not regex match operator !~.  It is<br>
probably not all that useful but it is now availabl.<br>
<br>
   name !~ 'Main.*'<br>
<br>
is exactly the same as<br>
<br>
   !(name ~ 'Main.*')<br>
<br>
<br>
The latest branch build can be downloaded from:<br>
<br>
   <a href="http://www.mkgmap.org.uk/download/mkgmap-expr-latest.zip" rel="noreferrer" target="_blank">http://www.mkgmap.org.uk/down<wbr>load/mkgmap-expr-latest.zip</a><br>
<br>
It is important to test it, as although I believe that the branch is<br>
now correct, some styles may have been relying on previous bugs.<br>
<br>
..Steve<br>
______________________________<wbr>_________________<br>
mkgmap-dev mailing list<br>
<a href="mailto:mkgmap-dev@lists.mkgmap.org.uk" target="_blank">mkgmap-dev@lists.mkgmap.org.uk</a><br>
<a href="http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev" rel="noreferrer" target="_blank">http://www.mkgmap.org.uk/mailm<wbr>an/listinfo/mkgmap-dev</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div><div>Felix Hartman - Openmtbmap.org & VeloMap.org<br></div>Schusterbergweg 32/8<br></div><div>6020 Innsbruck<br></div></div>Austria - Österreich</div></div></div></div>
</div>