}
if (*src == '?')
+ {
+ /* change original %? to new %< notation */
+ /* %?x?y&z? to %<x?y&z> where y and z are nestable */
+ char *p = (char *)src;
+ *p = '<';
+ for ( ; *p && *p != '?'; p++);
+ if (*p == '?')
+ p++;
+ for ( ; *p && *p != '?'; p++);
+ if (*p == '?')
+ *p = '>';
+ }
+
+ if (*src == '<')
{
flags |= M_FORMAT_OPTIONAL;
src++;
if (flags & M_FORMAT_OPTIONAL)
{
+ int lrbalance;
+
if (*src != '?')
break; /* bad format */
src++;
/* eat the `if' part of the string */
cp = ifstring;
count = 0;
- while (count < sizeof (ifstring) && *src && *src != '?' && *src != '&')
+ lrbalance = 1;
+ while (lrbalance > 0 && count < sizeof (ifstring) && *src)
{
if (*src == '\\')
{
src++;
- if (!*src)
- break;
+ *cp++ = *src++;
}
+ else if (src[0] == '%' && src[1] == '<')
+ lrbalance++;
+ else if (src[0] == '>')
+ lrbalance--;
+ if (lrbalance == 0)
+ break;
+ if (lrbalance == 1 && src[0] == '&')
+ break;
*cp++ = *src++;
count++;
}
src++; /* skip the & */
cp = elsestring;
count = 0;
- while (count < sizeof (elsestring) && *src && *src != '?')
+ while (lrbalance > 0 && count < sizeof (elsestring) && *src)
{
if (*src == '\\')
{
src++;
- if (!*src)
- break;
+ *cp++ = *src++;
}
+ else if (src[0] == '%' && src[1] == '<')
+ lrbalance++;
+ else if (src[0] == '>')
+ lrbalance--;
+ if (lrbalance == 0)
+ break;
+ if (lrbalance == 1 && src[0] == '&')
+ break;
*cp++ = *src++;
count++;
}
if (!*src)
break; /* bad format */
- src++; /* move past the trailing `?' */
+ src++; /* move past the trailing `>' (formerly '?') */
}
/* handle generic cases first */