add tolower and toupper to regsubst

This commit is contained in:
2019-05-21 09:24:54 +02:00
parent b84655e4de
commit ed300116bd
2 changed files with 47 additions and 5 deletions

View File

@ -601,7 +601,7 @@ It is only available if a PCRE library is installed.
<div class="box">
<p>
If PCRE is not available for your host or cross architecture, download
the sourcecode from <a target="ex" href="http://www.pcre.org/">www.pcre.org</a>
the sourcecode from <a target="ex" href="https://www.pcre.org/">www.pcre.org</a>
and try my EPICS compatible <a target="ex"
href="http://epics.web.psi.ch/software/streamdevice/pcre/Makefile">Makefile</a>
to compile it like a normal EPICS support module.
@ -656,6 +656,13 @@ Matches of the <em>regex</em> are replaced by the string <em>subst</em> with all
<code>\1</code> through <code>\9</code> replaced with the match of the corresponding
sub-expression <span class="new"> if such a sub-expression exists.
Occurrences of <code>\U<i>n</i></code>, <code>\L<i>n</i></code>, <code>\u<i>n</i></code>,
or <code>\l<i>n</i></code> with <code><i>n</i></code> being a number <code>0</code>
through <code>9</code> or <code>&</code> are replaced with the corresponding sub-expression
converted to all upper case, all lower case, first letter upper case, or first letter lower
case, respectively.</span>
</p>
<p><span class="new">
Due to limitations of the parser, <code>\1</code> and <code>\x01</code> are the same
which makes it difficult to use literal bytes with values lower than 10 in <em>subst</em>.
Therefore <code>\0</code> aways means a literal byte (incompatible change from earlier version!)
@ -722,6 +729,9 @@ which is not at the end of a word.
<code>%#/([^+-])*([+-])/\2\1/</code> moves a postfix sign to the front.
(<code>1.23-</code> becomes <code>-1.23</code>)<br>
</div>
<div class="indent">
<code>%#-2/.*/\U0/</code> converts the previous 2 characters to upper case.
</div>
<a name="mantexp"></a>
<h2>15. MantissaExponent DOUBLE converter (<code>%m</code>)</h2>
<p>

View File

@ -20,9 +20,10 @@
#include "StreamFormatConverter.h"
#include "StreamError.h"
#include "string.h"
#include "pcre.h"
#include <string.h>
#include <limits.h>
#include <ctype.h>
#define Z PRINTF_SIZE_T_PREFIX
@ -219,9 +220,40 @@ static void regsubst(const StreamFormat& fmt, StreamBuffer& buffer, size_t start
if (s[r] == esc)
{
unsigned char ch = s[r+1];
debug("found escaped \\%u, in range 1-%d?\n", ch, rc-1);
if (ch != 0 && ch < rc) // escaped 1 - 9 : replace with subexpr
if (strchr("ulUL", ch))
{
unsigned char br = s[r+2] - '0';
if (br == (unsigned char)('&'-'0')) br = 0;
debug("found case conversion \\%c%u\n", ch, br);
if (br >= rc)
{
s.remove(r, 1);
continue;
}
br *= 2;
rl = ovector[br+1] - ovector[br];
s.replace(r, 3, buffer(start+c+ovector[br]), rl);
switch (ch)
{
case 'u':
if (islower(s[r])) s[r] = toupper(s[r]);
break;
case 'l':
if (isupper(s[r])) s[r] = tolower(s[r]);
break;
case 'U':
for (int i = 0; i < rl; i++)
if (islower(s[r+i])) s[r+i] = toupper(s[r+i]);
break;
case 'L':
for (int i = 0; i < rl; i++)
if (isupper(s[r+i])) s[r+i] = tolower(s[r+i]);
break;
}
}
else if (ch != 0 && ch < rc) // escaped 1 - 9 : replace with subexpr
{
debug("found escaped \\%u\n", ch);
ch *= 2;
rl = ovector[ch+1] - ovector[ch];
debug("yes, replace \\%d: \"%s\"\n", ch/2, buffer.expand(start+c+ovector[ch], rl)());
@ -230,7 +262,7 @@ static void regsubst(const StreamFormat& fmt, StreamBuffer& buffer, size_t start
}
else
{
debug("no, use literal \\%u\n", ch);
debug("use literal \\%u\n", ch);
s.remove(r, 1); // just remove escape
}
}