Skip to content

Commit d8e0ace

Browse files
committed
Optimize dispstring parsing
1 parent b5aa9d6 commit d8e0ace

1 file changed

Lines changed: 17 additions & 14 deletions

File tree

sfparse.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -856,27 +856,30 @@ static int parser_dispstring(sfparse_parser *sfp, sfparse_value *dest) {
856856
case 0:
857857
return SFPARSE_ERR_PARSE;
858858
case 1:
859-
if (utf8state != UTF8_ACCEPT) {
860-
return SFPARSE_ERR_PARSE;
861-
}
862-
863859
++sfp->pos;
864860

865861
break;
866862
case 2:
867-
++sfp->pos;
863+
for (;;) {
864+
++sfp->pos;
868865

869-
if (sfp->pos + 2 > sfp->end) {
870-
return SFPARSE_ERR_PARSE;
871-
}
866+
if (sfp->pos + 2 > sfp->end || pctdecode(&c, &sfp->pos) != 0) {
867+
return SFPARSE_ERR_PARSE;
868+
}
872869

873-
if (pctdecode(&c, &sfp->pos) != 0) {
874-
return SFPARSE_ERR_PARSE;
875-
}
870+
utf8_decode(&utf8state, c);
871+
if (utf8state == UTF8_ACCEPT) {
872+
if (sfp->pos != sfp->end && *sfp->pos == '%') {
873+
continue;
874+
}
876875

877-
utf8_decode(&utf8state, c);
878-
if (utf8state == UTF8_REJECT) {
879-
return SFPARSE_ERR_PARSE;
876+
break;
877+
}
878+
879+
if (utf8state == UTF8_REJECT || sfp->pos + 1 > sfp->end ||
880+
*sfp->pos != '%') {
881+
return SFPARSE_ERR_PARSE;
882+
}
880883
}
881884

882885
break;

0 commit comments

Comments
 (0)