On 28/09/15 09:09, Samuel Iglesias Gonsalvez wrote:
Fix SCons MinGW build error:

Compiling src/mesa/main/shader_query.cpp ...
src/mesa/main/shader_query.cpp: In function ‘char* get_top_level_name(const 
char*)’:
src/mesa/main/shader_query.cpp:841:34: error: ‘strndup’ was not declared in 
this scope
     return strndup(name, name_size);
                                   ^
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92124
Signed-off-by: Samuel Iglesias Gonsalvez <[email protected]>

Thanks for looking into this.

---
  src/mesa/main/shader_query.cpp | 19 ++++++++++++++-----
  1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index e020dce..7eecb39 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -838,18 +838,27 @@ get_top_level_name(const char *name)
     else
        name_size = first_square_bracket - name;

-   return strndup(name, name_size);
+   char *result = (char *) malloc((name_size + 1) * sizeof(char));
+   strncpy(result, name, name_size);
+   result[name_size] = '\0';
+   return result;

I think we should add a strndup inline implementation in a shared header somewhere. We should avoid having the strndup reimplemented repeatedly, as that is error prone.

And that implementation should malloc the length of the resulting string plus one, not the max_size + 1 to avoid wasting memory if later strndup is invoked with a max_size much larger than the incoming string.

  }

  static char*
  get_var_name(const char *name)
  {
     const char *first_dot = strchr(name, '.');
+   char *result;

-   if (!first_dot)
-      return strdup(name);
-

Both MinGW and MSVC have strdup. They just lack strndup.

-   return strndup(first_dot+1, strlen(first_dot) - 1);

I think we could just return `strdup(first_dot)`.


+   if (!first_dot) {
+      result = (char *) malloc(strlen(name) * sizeof(char));
+      return strcpy(result, name);
+   }
+   int var_name_size = strlen(first_dot) - 1;
+   result = (char *) malloc((var_name_size + 1) * sizeof(char));
+   strncpy(result, first_dot+1, var_name_size);
+   result[var_name_size] = '\0';
+   return result;
  }

  static GLint



Jose
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to