]> Savannah Git Hosting - gnulib.git/commitdiff
striconveha: pacify gcc -Wcast-align
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 15 Nov 2023 08:09:03 +0000 (00:09 -0800)
committerBruno Haible <bruno@clisp.org>
Fri, 24 Nov 2023 07:28:39 +0000 (08:28 +0100)
* lib/striconveha.c (uniconv_register_autodetect): Rewrite to
avoid the need to cast from char * to a pointer to a more strictly
aligned type.  Use decls after statements to avoid some repetition.

ChangeLog
lib/striconveha.c

index e7b85edc8069ecc25031f0c5772f0e2e97e5eac5..7d8b33d4833293b22251d9bdd23480a9e8666448 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2023-11-15  Paul Eggert  <eggert@cs.ucla.edu>
+
+       striconveha: pacify gcc -Wcast-align
+       * lib/striconveha.c (uniconv_register_autodetect): Rewrite to
+       avoid the need to cast from char * to a pointer to a more strictly
+       aligned type.  Use decls after statements to avoid some repetition.
+
 2023-11-10  Bruno Haible  <bruno@clisp.org>
 
        tests: In multithreaded tests, use random() instead of rand().
index f388c9f09528428e1838c1acbfd6b69209719895..2bf0338e44f059c45245cc4dde5e36ee29e5f306 100644 (file)
@@ -88,10 +88,6 @@ uniconv_register_autodetect (const char *name,
   size_t listlen;
   size_t memneed;
   size_t i;
-  char *memory;
-  struct autodetect_alias *new_alias;
-  char *new_name;
-  const char **new_try_in_order;
 
   /* The TRY_IN_ORDER list must not be empty.  */
   if (try_in_order[0] == NULL)
@@ -108,25 +104,24 @@ uniconv_register_autodetect (const char *name,
     memneed += sizeof (char *) + strlen (try_in_order[i]) + 1;
   listlen = i;
 
-  memory = (char *) malloc (memneed);
+  void *memory = malloc (memneed);
   if (memory != NULL)
     {
-      new_alias = (struct autodetect_alias *) memory;
-      memory += sizeof (struct autodetect_alias);
+      struct autodetect_alias *new_alias = memory;
+      memory = new_alias + 1;
 
-      new_try_in_order = (const char **) memory;
-      memory += (listlen + 1) * sizeof (char *);
+      char const **new_try_in_order = memory;
+      memory = new_try_in_order + listlen + 1;
 
-      new_name = (char *) memory;
-      memcpy (new_name, name, namelen);
-      memory += namelen;
+      char *new_name = memcpy (memory, name, namelen);
+      memory = new_name + namelen;
 
       for (i = 0; i < listlen; i++)
         {
           size_t len = strlen (try_in_order[i]) + 1;
-          memcpy (memory, try_in_order[i], len);
-          new_try_in_order[i] = (const char *) memory;
-          memory += len;
+          char *copy = memcpy (memory, try_in_order[i], len);
+          new_try_in_order[i] = copy;
+          memory = copy + len;
         }
       new_try_in_order[i] = NULL;