(linenum→info "unix/slp.c:2238")

glibc/2.7/locale/coll-lookup.c

    1: /* Copyright (C) 2000, 2003 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3:    Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #include <stdint.h>
   21: 
   22: /* Lookup in a table of int32_t, with default value 0.  */
   23: int32_t
   24: internal_function
   25: __collidx_table_lookup (const char *table, uint32_t wc)
   26: {
   27:   uint32_t shift1 = ((const uint32_t *) table)[0];
   28:   uint32_t index1 = wc >> shift1;
   29:   uint32_t bound = ((const uint32_t *) table)[1];
   30:   if (index1 < bound)
   31:     {
   32:       uint32_t lookup1 = ((const uint32_t *) table)[5 + index1];
   33:       if (lookup1 != 0)
   34:         {
   35:           uint32_t shift2 = ((const uint32_t *) table)[2];
   36:           uint32_t mask2 = ((const uint32_t *) table)[3];
   37:           uint32_t index2 = (wc >> shift2) & mask2;
   38:           uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2];
   39:           if (lookup2 != 0)
   40:             {
   41:               uint32_t mask3 = ((const uint32_t *) table)[4];
   42:               uint32_t index3 = wc & mask3;
   43:               int32_t lookup3 = ((const int32_t *)(table + lookup2))[index3];
   44: 
   45:               return lookup3;
   46:             }
   47:         }
   48:     }
   49:   return 0;
   50: }
   51: 
   52: 
   53: /* Lookup in a table of uint32_t, with default value 0xffffffff.  */
   54: uint32_t
   55: internal_function
   56: __collseq_table_lookup (const char *table, uint32_t wc)
   57: {
   58:   uint32_t shift1 = ((const uint32_t *) table)[0];
   59:   uint32_t index1 = wc >> shift1;
   60:   uint32_t bound = ((const uint32_t *) table)[1];
   61:   if (index1 < bound)
   62:     {
   63:       uint32_t lookup1 = ((const uint32_t *) table)[5 + index1];
   64:       if (lookup1 != 0)
   65:         {
   66:           uint32_t shift2 = ((const uint32_t *) table)[2];
   67:           uint32_t mask2 = ((const uint32_t *) table)[3];
   68:           uint32_t index2 = (wc >> shift2) & mask2;
   69:           uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2];
   70:           if (lookup2 != 0)
   71:             {
   72:               uint32_t mask3 = ((const uint32_t *) table)[4];
   73:               uint32_t index3 = wc & mask3;
   74:               uint32_t lookup3 = ((const uint32_t *)(table + lookup2))[index3];
   75: 
   76:               return lookup3;
   77:             }
   78:         }
   79:     }
   80:   return ~((uint32_t) 0);
   81: }
Syntax (Markdown)