[Mesa-dev] [PATCH] util: implement strndup for WIN32

Samuel Iglesias Gonsálvez siglesias at igalia.com
Mon Sep 28 23:40:30 PDT 2015



On 28/09/15 21:44, Jose Fonseca wrote:
> Looks great Samuel.
> 
> Just minor suggestions.
> 
> Either way:
> 
> Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
> 

Thanks!

> 
> On 28/09/15 15:19, Samuel Iglesias Gonsalvez wrote:
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92124
>> Cc: Jose Fonseca <jfonseca at vmware.com>
>> ---
>>
>> I tested it on MSVC but not MinGW. I hope I did not something wrong.
>>
>>   src/mesa/main/shader_query.cpp |  1 +
>>   src/util/Makefile.sources      |  1 +
>>   src/util/strndup.c             | 47
>> ++++++++++++++++++++++++++++++++++++++++++
>>   src/util/strndup.h             | 28 +++++++++++++++++++++++++
>>   4 files changed, 77 insertions(+)
>>   create mode 100644 src/util/strndup.c
>>   create mode 100644 src/util/strndup.h
>>
>> diff --git a/src/mesa/main/shader_query.cpp
>> b/src/mesa/main/shader_query.cpp
>> index e020dce..0cada50 100644
>> --- a/src/mesa/main/shader_query.cpp
>> +++ b/src/mesa/main/shader_query.cpp
>> @@ -37,6 +37,7 @@
>>   #include "../glsl/program.h"
>>   #include "uniforms.h"
>>   #include "main/enums.h"
>> +#include "util/strndup.h"
>>
>>   extern "C" {
>>   #include "shaderapi.h"
>> diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
>> index afdd0cb..10f2c02 100644
>> --- a/src/util/Makefile.sources
>> +++ b/src/util/Makefile.sources
>> @@ -17,6 +17,7 @@ MESA_UTIL_FILES :=    \
>>       set.c \
>>       set.h \
>>       simple_list.h \
>> +    strndup.c \
>>       strtod.c \
>>       strtod.h \
>>       texcompress_rgtc_tmp.h \
>> diff --git a/src/util/strndup.c b/src/util/strndup.c
>> new file mode 100644
>> index 0000000..6e5bb22
>> --- /dev/null
>> +++ b/src/util/strndup.c
>> @@ -0,0 +1,47 @@
>> +/*
>> + * Copyright (c) 2015 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person
>> obtaining a
>> + * copy of this software and associated documentation files (the
>> "Software"),
>> + * to deal in the Software without restriction, including without
>> limitation
>> + * the rights to use, copy, modify, merge, publish, distribute,
>> sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including
>> the next
>> + * paragraph) shall be included in all copies or substantial portions
>> of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
>> SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
>> +
>> +#if defined(_WIN32)
>> +#include <stdlib.h>
>> +#include "strndup.h"
>> +
>> +char *
>> +strndup(const char *str, size_t max)
>> +{
>> +   size_t n;
>> +   char *ptr;
>> +
>> +   if (str == NULL)
>> +      return NULL;
>> +
>> +   n = strlen(str);
>> +   if (n > max)
>> +      n = max;
>> +
>> +   ptr = (char *) malloc((n + 1) * sizeof(char));
> 
> Probably never happens, but still good idea to add
> 
>   if (!ptr) return NULL;
> 
> just in case
> 

OK, Emil said the same thing. I'll check if the allocation fails.

>> +   memcpy(ptr, str, n);
>> +   ptr[n] = '\0';
>> +   return ptr;
>> +}
>> +
>> +#endif
>> diff --git a/src/util/strndup.h b/src/util/strndup.h
>> new file mode 100644
>> index 0000000..dc8cdd2
>> --- /dev/null
>> +++ b/src/util/strndup.h
>> @@ -0,0 +1,28 @@
>> +/*
>> + * Copyright (c) 2015 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person
>> obtaining a
>> + * copy of this software and associated documentation files (the
>> "Software"),
>> + * to deal in the Software without restriction, including without
>> limitation
>> + * the rights to use, copy, modify, merge, publish, distribute,
>> sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including
>> the next
>> + * paragraph) shall be included in all copies or substantial portions
>> of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
>> SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> OTHER DEALINGS
>> + * IN THE SOFTWARE.
>> + */
> 
> #pragma once
> 
> #include <stdlib.h> // size_t
> 

OK.

Sam

>> +
>> +#if defined(_WIN32)
>> +
>> +extern char *strndup(const char *str, size_t max);
>> +
>> +#endif
>>
> 
> 


More information about the mesa-dev mailing list