[Mesa-dev] [PATCH 08/12] glcpp: Use strpbrk in the line continuations pass

Vladislav Egorov vegorov180 at gmail.com
Sat Jan 7 21:56:25 UTC 2017


Oh. Thanks! This is embarrassing. I have no idea how did I manage to 
miss it. Line continuations are so rare that only two games in my 
shader-db use them -- Talos Principle and Serious Sam (both use Serious 
Engine). And neither of them hit this condition. I probably need to fuzz 
this thing or something.

I'll send fixup.

07.01.2017 22:53, Gustaw Smolarczyk пишет:
> 7 sty 2017 20:04 "Vladislav Egorov" <vegorov180 at gmail.com 
> <mailto:vegorov180 at gmail.com>> napisał(a):
>
>     To find newlines the line continuations removal pass uses strchr()
>     twice -- first time to find '\n', second time to find '\r'. Now,
>     if the shader uses Unix line separators '\n', the file could contain
>     no '\r' at all, so each time it will scan to the end of the shader.
>     Use strpbrk() standard function instead that was specifically created
>     to search many characters at once.
>     ---
>      src/compiler/glsl/glcpp/pp.c | 28 ++++++++--------------------
>      1 file changed, 8 insertions(+), 20 deletions(-)
>
>     diff --git a/src/compiler/glsl/glcpp/pp.c
>     b/src/compiler/glsl/glcpp/pp.c
>     index c196868..c4c0196 100644
>     --- a/src/compiler/glsl/glcpp/pp.c
>     +++ b/src/compiler/glsl/glcpp/pp.c
>     @@ -231,7 +231,6 @@ remove_line_continuations(glcpp_parser_t *ctx,
>     const char *shader)
>      {
>             struct string_buffer sb;
>             const char *backslash, *newline, *search_start;
>     -        const char *cr, *lf;
>              char newline_separator[3];
>             int collapsed_newlines = 0;
>             int separator_len;
>     @@ -266,23 +265,19 @@ remove_line_continuations(glcpp_parser_t
>     *ctx, const char *shader)
>              * examining the first encountered newline terminator, and
>     using the
>              * same terminator for any newlines we insert.
>              */
>     -       cr = strchr(search_start, '\r');
>     -       lf = strchr(search_start, '\n');
>     +       newline = strpbrk(search_start, "\r\n");
>
>             newline_separator[0] = '\n';
>             newline_separator[1] = '\0';
>             newline_separator[2] = '\0';
>
>     -       if (cr == NULL) {
>     +       if (newline == NULL) {
>                     /* Nothing to do. */
>     -       } else if (lf == NULL) {
>     -               newline_separator[0] = '\r';
>     -       } else if (lf == cr + 1) {
>     -               newline_separator[0] = '\r';
>     -               newline_separator[1] = '\n';
>     -       } else if (cr == lf + 1) {
>     -               newline_separator[0] = '\n';
>     -               newline_separator[1] = '\r';
>     +       } else if (newline[1] == '\n' || newline[1] == '\r') {
>
> What if we have \n\n ? Won't it match it as a single newline?
>
> Regards,
> Gustaw

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170108/2fcd6a94/attachment.html>


More information about the mesa-dev mailing list