_i18n_number_rewrite: Use struct scratch_buffer

Message ID 20170619162236.49362402AEC3C@oldenburg.str.redhat.com
State Committed
Headers

Commit Message

Florian Weimer June 19, 2017, 4:22 p.m. UTC
  2017-06-19  Florian Weimer  <fweimer@redhat.com>

	* stdio-common/_i18n_number.h (_i18n_number_rewrite): Use struct
	scratch_buffer.
  

Comments

Adhemerval Zanella June 27, 2017, 8:34 p.m. UTC | #1
On 19/06/2017 13:22, Florian Weimer wrote:
> 2017-06-19  Florian Weimer  <fweimer@redhat.com>
> 
> 	* stdio-common/_i18n_number.h (_i18n_number_rewrite): Use struct
> 	scratch_buffer.

LGTM, thanks.

> 
> diff --git a/stdio-common/_i18n_number.h b/stdio-common/_i18n_number.h
> index 080e814..13d5936 100644
> --- a/stdio-common/_i18n_number.h
> +++ b/stdio-common/_i18n_number.h
> @@ -19,6 +19,7 @@
>  #include <stdbool.h>
>  #include <wchar.h>
>  #include <wctype.h>
> +#include <scratch_buffer.h>
>  
>  #include "../locale/outdigits.h"
>  #include "../locale/outdigitswc.h"
> @@ -65,17 +66,13 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
>  
>    /* Copy existing string so that nothing gets overwritten.  */
>    CHAR_T *src;
> -  bool use_alloca = __libc_use_alloca ((rear_ptr - w) * sizeof (CHAR_T));
> -  if (__builtin_expect (use_alloca, true))
> -    src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T));
> -  else
> -    {
> -      src = (CHAR_T *) malloc ((rear_ptr - w) * sizeof (CHAR_T));
> -      if (src == NULL)
> -	/* If we cannot allocate the memory don't rewrite the string.
> -	   It is better than nothing.  */
> -	return w;
> -    }
> +  struct scratch_buffer buffer;
> +  scratch_buffer_init (&buffer);
> +  if (!scratch_buffer_set_array_size (&buffer, rear_ptr - w, sizeof (CHAR_T)))
> +    /* If we cannot allocate the memory don't rewrite the string.
> +       It is better than nothing.  */
> +    return w;
> +  src = buffer.data;
>  
>    CHAR_T *s = (CHAR_T *) __mempcpy (src, w,
>  				    (rear_ptr - w) * sizeof (CHAR_T));
> @@ -110,8 +107,6 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
>  	}
>      }
>  
> -  if (! use_alloca)
> -    free (src);
> -
> +  scratch_buffer_free (&buffer);
>    return w;
>  }
>
  

Patch

diff --git a/stdio-common/_i18n_number.h b/stdio-common/_i18n_number.h
index 080e814..13d5936 100644
--- a/stdio-common/_i18n_number.h
+++ b/stdio-common/_i18n_number.h
@@ -19,6 +19,7 @@ 
 #include <stdbool.h>
 #include <wchar.h>
 #include <wctype.h>
+#include <scratch_buffer.h>
 
 #include "../locale/outdigits.h"
 #include "../locale/outdigitswc.h"
@@ -65,17 +66,13 @@  _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
 
   /* Copy existing string so that nothing gets overwritten.  */
   CHAR_T *src;
-  bool use_alloca = __libc_use_alloca ((rear_ptr - w) * sizeof (CHAR_T));
-  if (__builtin_expect (use_alloca, true))
-    src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T));
-  else
-    {
-      src = (CHAR_T *) malloc ((rear_ptr - w) * sizeof (CHAR_T));
-      if (src == NULL)
-	/* If we cannot allocate the memory don't rewrite the string.
-	   It is better than nothing.  */
-	return w;
-    }
+  struct scratch_buffer buffer;
+  scratch_buffer_init (&buffer);
+  if (!scratch_buffer_set_array_size (&buffer, rear_ptr - w, sizeof (CHAR_T)))
+    /* If we cannot allocate the memory don't rewrite the string.
+       It is better than nothing.  */
+    return w;
+  src = buffer.data;
 
   CHAR_T *s = (CHAR_T *) __mempcpy (src, w,
 				    (rear_ptr - w) * sizeof (CHAR_T));
@@ -110,8 +107,6 @@  _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
 	}
     }
 
-  if (! use_alloca)
-    free (src);
-
+  scratch_buffer_free (&buffer);
   return w;
 }