mirror of
https://github.com/open-simh/simtools.git
synced 2026-01-13 15:27:18 +00:00
Rearrange flow control in brackrange()
which was a bit weird. This also fixes a potential bug when a bracketed or nested string is not properly terminated on this line.
This commit is contained in:
parent
13c5a8374f
commit
289860e539
50
parse.c
50
parse.c
@ -794,58 +794,50 @@ int brackrange(
|
||||
int *length,
|
||||
char **endp)
|
||||
{
|
||||
char endstr[6];
|
||||
int endlen;
|
||||
char endstr[] = "x\n";
|
||||
int len = 0;
|
||||
int nest;
|
||||
int len;
|
||||
|
||||
switch (*cp) {
|
||||
case '^':
|
||||
case '^': /* ^/text/ */
|
||||
endstr[0] = cp[1];
|
||||
strcpy(endstr + 1, "\n");
|
||||
*start = 2;
|
||||
endlen = 1;
|
||||
cp += *start;
|
||||
len = strcspn(cp, endstr);
|
||||
break;
|
||||
case '<':
|
||||
strcpy(endstr, "<>\n");
|
||||
endlen = 1;
|
||||
case '<': /* <may<be>nested> */
|
||||
*start = 1;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
cp += *start;
|
||||
|
||||
len = 0;
|
||||
if (endstr[1] == '>') { /* <>\n */
|
||||
cp += *start;
|
||||
nest = 1;
|
||||
while (nest) {
|
||||
|
||||
while (nest > 0) {
|
||||
int sublen;
|
||||
|
||||
sublen = strcspn(cp + len, endstr);
|
||||
sublen = strcspn(cp + len, "<>\n");
|
||||
if (cp[len + sublen] == '<') {
|
||||
nest++;
|
||||
sublen++; /* avoid infinite loop when sublen == 0 */
|
||||
sublen++; /* include nested starting delimiter */
|
||||
} else {
|
||||
nest--;
|
||||
if (nest > 0 && cp[len + sublen] == '>')
|
||||
sublen++; /* avoid infinite loop when sublen == 0 */
|
||||
sublen++; /* include nested ending delimiter */
|
||||
}
|
||||
len += sublen;
|
||||
if (sublen == 0)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
int sublen;
|
||||
|
||||
sublen = strcspn(cp + len, endstr);
|
||||
len += sublen;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*length = len;
|
||||
if (endp)
|
||||
*endp = cp + len + endlen;
|
||||
if (endp) {
|
||||
*endp = cp + len;
|
||||
if (**endp && **endp != '\n') {
|
||||
++*endp; /* skip over ending delimiter */
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user