[Lazarus] TMask revisited
Bart
bartjunk64 at gmail.com
Sun Oct 24 15:26:12 CEST 2021
On Sat, Oct 23, 2021 at 11:33 PM Bart <bartjunk64 at gmail.com> wrote:
> I renamed mocOptionaChar to mocSet and added some comments in the code.
>
> @José: are these comments correct?
I'm still strugling with the difference between mocRange and mocSet
(previously mocOptionalChar).
Consider the following mask: [a-c]
With [mocRange] this matches 'a', 'b', or 'c', but not '-'.
With [mocSet] this matches 'a', '-' or 'c', but not 'b'.
That's clear to me.
Mask [ac]
[mocRange]: matches 'a' or 'c'.
[mocSet]: matches 'a' or 'c'.
To me this seems as [mocRange] is equivalent to [mocRange,mocSet]
So, only mocSet without mocRange has a special meaning.
Or they should be mutually exclusive: if you enable mocSet, mocRange
should be disabled and vice versa (the latter does not cause any
functional change).
Now we take into account the mocEscapeChar and things get a little confusing.
IIUC then if mocEscapeChar is eneabled, then EscapeChar+SomeChar is
interpreted as just a literal SomeChar.
By default EscapeChar = '\' so '\*' is a literal '*' and '\\' is a literal '\'.
And '\-' should mean a literal '-'.
In the following examples RangeAutoReverse is set to FALSE.
Opcodes : [mocRange]
Mask : [a\-]
Filename: -
EMaskError: Missing closing character "]" in mask (offset 5).
This is to be expected.
Opcodes : [mocRange,mocEscapeChar]
Mask : [a\-]
Filename: -
EMaskError: Missing closing character "]" in mask (offset 5). ********** ?
Escaping the '-' should mean that the mask should match 'a' or '-'
Opcodes : [mocSet]
Mask : [a\-]
Filename: \
Matches
This is expected
Opcodes : [mocSet,mocEscapeChar]
Mask : [a\-]
Filename: \
Matches
Since mocEscapeChar is enabled the sequence '\-' should be interpreted
as a literal '-' and it should therefore not match '\'.
Some more oddities:
Opcodes : [mocRange]
Mask : [$\-&]
Filename: $
Matches
Opcodes : [mocRange]
Mask : [$\-&]
Filename: %
Does NOT match
Opcodes : [mocRange]
Mask : [$\-&]
Filename: &
Does NOT match
Actually OK, since the range '\-&' is not reversed and therefore empty
(took me a while to realize that)
Opcodes : [mocRange]
Mask : [$\-&]
Filename: -
Does NOT match
Opcodes : [mocRange]
Mask : [$\-&]
Filename: \
Does NOT match
Opcodes : [mocRange,mocEscapeChar]
Mask : [$\-&]
Filename: $
Matches
Opcodes : [mocRange,mocEscapeChar]
Mask : [$\-&]
Filename: %
Does NOT match
Opcodes : [mocRange,mocEscapeChar]
Mask : [$\-&]
Filename: &
Does NOT match ************ ?
Looks like '\-&' is interpreted as an (empty) range, but '\-' should
be interpreted as a literal '-', so not a range but a set, and it
should match
Opcodes : [mocRange,mocEscapeChar]
Mask : [$\-&]
Filename: -
Does NOT match ************ ?
Same argument as above
Opcodes : [mocRange,mocEscapeChar]
Mask : [$\-&]
Filename: \
Does NOT match
With [mocSet] instead of [mocRange]
Opcodes : [mocSet]
Mask : [$\-&]
Filename: \
Matches
Opcodes : [mocSet,mocEscapeChar]
Mask : [$\-&]
Filename: \
Matches ************ ?
Here enabling mocEscapeChar makes no difference at all. (Checked the
same filenames as with mocRange)
Finally this:
Opcodes : [mocRange]
Mask : [\a-c]
Filename: \
Matches
Opcodes : [mocRange,mocEscapeChar]
Mask : [\a-c]
Filename: \
Matches ************ ?
It should not.
It looks like escaping does not work as advertised?
--
Bart
More information about the lazarus
mailing list