| xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 1 | /* Copyright (C) 2000-2016 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, see | 
 | 17 |    <http://www.gnu.org/licenses/>.  */ | 
 | 18 |  | 
 | 19 | #include <stdint.h> | 
 | 20 |  | 
 | 21 | /* Lookup in a table of int32_t, with default value 0.  */ | 
 | 22 | int32_t | 
 | 23 | internal_function | 
 | 24 | __collidx_table_lookup (const char *table, uint32_t wc) | 
 | 25 | { | 
 | 26 |   uint32_t shift1 = ((const uint32_t *) table)[0]; | 
 | 27 |   uint32_t index1 = wc >> shift1; | 
 | 28 |   uint32_t bound = ((const uint32_t *) table)[1]; | 
 | 29 |   if (index1 < bound) | 
 | 30 |     { | 
 | 31 |       uint32_t lookup1 = ((const uint32_t *) table)[5 + index1]; | 
 | 32 |       if (lookup1 != 0) | 
 | 33 | 	{ | 
 | 34 | 	  uint32_t shift2 = ((const uint32_t *) table)[2]; | 
 | 35 | 	  uint32_t mask2 = ((const uint32_t *) table)[3]; | 
 | 36 | 	  uint32_t index2 = (wc >> shift2) & mask2; | 
 | 37 | 	  uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2]; | 
 | 38 | 	  if (lookup2 != 0) | 
 | 39 | 	    { | 
 | 40 | 	      uint32_t mask3 = ((const uint32_t *) table)[4]; | 
 | 41 | 	      uint32_t index3 = wc & mask3; | 
 | 42 | 	      int32_t lookup3 = ((const int32_t *)(table + lookup2))[index3]; | 
 | 43 |  | 
 | 44 | 	      return lookup3; | 
 | 45 | 	    } | 
 | 46 | 	} | 
 | 47 |     } | 
 | 48 |   return 0; | 
 | 49 | } | 
 | 50 |  | 
 | 51 |  | 
 | 52 | /* Lookup in a table of uint32_t, with default value 0xffffffff.  */ | 
 | 53 | uint32_t | 
 | 54 | internal_function | 
 | 55 | __collseq_table_lookup (const char *table, uint32_t wc) | 
 | 56 | { | 
 | 57 |   uint32_t shift1 = ((const uint32_t *) table)[0]; | 
 | 58 |   uint32_t index1 = wc >> shift1; | 
 | 59 |   uint32_t bound = ((const uint32_t *) table)[1]; | 
 | 60 |   if (index1 < bound) | 
 | 61 |     { | 
 | 62 |       uint32_t lookup1 = ((const uint32_t *) table)[5 + index1]; | 
 | 63 |       if (lookup1 != 0) | 
 | 64 | 	{ | 
 | 65 | 	  uint32_t shift2 = ((const uint32_t *) table)[2]; | 
 | 66 | 	  uint32_t mask2 = ((const uint32_t *) table)[3]; | 
 | 67 | 	  uint32_t index2 = (wc >> shift2) & mask2; | 
 | 68 | 	  uint32_t lookup2 = ((const uint32_t *)(table + lookup1))[index2]; | 
 | 69 | 	  if (lookup2 != 0) | 
 | 70 | 	    { | 
 | 71 | 	      uint32_t mask3 = ((const uint32_t *) table)[4]; | 
 | 72 | 	      uint32_t index3 = wc & mask3; | 
 | 73 | 	      uint32_t lookup3 = ((const uint32_t *)(table + lookup2))[index3]; | 
 | 74 |  | 
 | 75 | 	      return lookup3; | 
 | 76 | 	    } | 
 | 77 | 	} | 
 | 78 |     } | 
 | 79 |   return ~((uint32_t) 0); | 
 | 80 | } |