(more_help): Check result of __asprintf call and don't use string if it
[kopensolaris-gnu/glibc.git] / locale / weight.h
index 356ee57..d67e9d9 100644 (file)
@@ -1,28 +1,30 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996,1997,1998,1999,2000,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Ulrich Drepper, <drepper@cygnus.com>.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 /* Find index of weight.  */
 static inline int32_t
+__attribute ((always_inline))
 findidx (const unsigned char **cpp)
 {
   int_fast32_t i = table[*(*cpp)++];
   const unsigned char *cp;
+  const unsigned char *usrc;
 
   if (i >= 0)
     /* This is an index into the weight table.  Cool.  */
@@ -31,13 +33,13 @@ findidx (const unsigned char **cpp)
   /* Oh well, more than one sequence starting with this byte.
      Search for the correct one.  */
   cp = &extra[-i];
+  usrc = *cpp;
   while (1)
     {
       size_t nhere;
-      const unsigned char *usrc = *cpp;
 
       /* The first thing is the index.  */
-      i = *((int32_t *) cp);
+      i = *((const int32_t *) cp);
       cp += sizeof (int32_t);
 
       /* Next is the length of the byte sequence.  These are always
@@ -67,6 +69,8 @@ findidx (const unsigned char **cpp)
 
          /* Up to the next entry.  */
          cp += nhere;
+         if ((1 + nhere) % __alignof__ (int32_t) != 0)
+           cp += __alignof__ (int32_t) - (1 + nhere) % __alignof__ (int32_t);
        }
       else
        {
@@ -85,6 +89,9 @@ findidx (const unsigned char **cpp)
                {
                  /* Cannot be in this range.  */
                  cp += 2 * nhere;
+                 if ((1 + 2 * nhere) % __alignof__ (int32_t) != 0)
+                   cp += (__alignof__ (int32_t)
+                          - (1 + 2 * nhere) % __alignof__ (int32_t));
                  continue;
                }
 
@@ -97,6 +104,9 @@ findidx (const unsigned char **cpp)
                {
                  /* Cannot be in this range.  */
                  cp += 2 * nhere;
+                 if ((1 + 2 * nhere) % __alignof__ (int32_t) != 0)
+                   cp += (__alignof__ (int32_t)
+                          - (1 + 2 * nhere) % __alignof__ (int32_t));
                  continue;
                }
 
@@ -113,7 +123,7 @@ findidx (const unsigned char **cpp)
            }
 
          *cpp += nhere;
-         return offset;
+         return indirect[-i + offset];
        }
     }