my $declaration = $members;
 
        # Split nested struct/union elements as newer ones
-       my $cont = 1;
-       while ($cont) {
-               $cont = 0;
-               while ($members =~ m/(struct|union)([^{};]+){([^{}]*)}([^{}\;]*)\;/) {
-                       my $newmember = "$1 $4;";
-                       my $id = $4;
-                       my $content = $3;
+       while ($members =~ m/(struct|union)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)\;/) {
+               my $newmember;
+               my $maintype = $1;
+               my $ids = $4;
+               my $content = $3;
+               foreach my $id(split /,/, $ids) {
+                       $newmember .= "$maintype $id; ";
+
                        $id =~ s/[:\[].*//;
-                       $id =~ s/^\*+//;
+                       $id =~ s/^\s*\**(\S+)\s*/$1/;
                        foreach my $arg (split /;/, $content) {
                                next if ($arg =~ m/^\s*$/);
                                if ($arg =~ m/^([^\(]+\(\*?\s*)([\w\.]*)(\s*\).*)/) {
                                        next if (!$name);
                                        if ($id =~ m/^\s*$/) {
                                                # anonymous struct/union
-                                               $newmember .= "$type$name$extra;";
+                                               $newmember .= "$type$name$extra; ";
                                        } else {
-                                               $newmember .= "$type$id.$name$extra;";
+                                               $newmember .= "$type$id.$name$extra; ";
                                        }
                                } else {
-                                       my $type = $arg;
-                                       my $name = $arg;
-                                       $type =~ s/\s\S+$//;
-                                       $name =~ s/.*\s+//;
-                                       $name =~ s/[:\[].*//;
-                                       $name =~ s/^\*+//;
-                                       next if (($name =~ m/^\s*$/));
-                                       if ($id =~ m/^\s*$/) {
-                                               # anonymous struct/union
-                                               $newmember .= "$type $name;";
+                                       my $type;
+                                       my $names;
+                                       $arg =~ s/^\s+//;
+                                       $arg =~ s/\s+$//;
+                                       # Handle bitmaps
+                                       $arg =~ s/:\s*\d+\s*//g;
+                                       # Handle arrays
+                                       $arg =~ s/\[\S+\]//g;
+                                       # The type may have multiple words,
+                                       # and multiple IDs can be defined, like:
+                                       #       const struct foo, *bar, foobar
+                                       # So, we remove spaces when parsing the
+                                       # names, in order to match just names
+                                       # and commas for the names
+                                       $arg =~ s/\s*,\s*/,/g;
+                                       if ($arg =~ m/(.*)\s+([\S+,]+)/) {
+                                               $type = $1;
+                                               $names = $2;
                                        } else {
-                                               $newmember .= "$type $id.$name;";
+                                               $newmember .= "$arg; ";
+                                               next;
+                                       }
+                                       foreach my $name (split /,/, $names) {
+                                               $name =~ s/^\s*\**(\S+)\s*/$1/;
+                                               next if (($name =~ m/^\s*$/));
+                                               if ($id =~ m/^\s*$/) {
+                                                       # anonymous struct/union
+                                                       $newmember .= "$type $name; ";
+                                               } else {
+                                                       $newmember .= "$type $id.$name; ";
+                                               }
                                        }
                                }
                        }
-                       $members =~ s/(struct|union)([^{};]+){([^{}]*)}([^{}\;]*)\;/$newmember/;
-                       $cont = 1;
-               };
-       };
+               }
+               $members =~ s/(struct|union)([^\{\};]+)\{([^\{\}]*)}([^\{\}\;]*)\;/$newmember/;
+       }
 
        # Ignore other nested elements, like enums
        $members =~ s/({[^\{\}]*})//g;