Back to index

courier  0.68.2
unicode_tablookup.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2011 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 **
00005 */
00006 
00007 #include      "unicode_config.h"
00008 #include      "unicode.h"
00009 
00010 #define BLOCK_SIZE   256
00011 
00012 uint8_t unicode_tab_lookup(unicode_char ch,
00013                         const size_t *unicode_indextab,
00014                         size_t unicode_indextab_sizeof,
00015                         const uint8_t (*unicode_rangetab)[2],
00016                         const uint8_t *unicode_classtab,
00017                         uint8_t uclass)
00018 {
00019        size_t cl=ch / BLOCK_SIZE;
00020 
00021        if (cl < unicode_indextab_sizeof-1)
00022        {
00023               const size_t start_pos=unicode_indextab[cl];
00024               const uint8_t (*p)[2]=unicode_rangetab + start_pos;
00025               size_t b=0, e=unicode_indextab[cl+1] - start_pos;
00026               uint8_t chmodcl= ch & (BLOCK_SIZE-1);
00027 
00028               while (b < e)
00029               {
00030                      size_t n=b + (e-b)/2;
00031 
00032                      if (chmodcl >= p[n][0])
00033                      {
00034                             if (chmodcl <= p[n][1])
00035                             {
00036                                    uclass=unicode_classtab[start_pos+n];
00037                                    break;
00038                             }
00039                             b=n+1;
00040                      }
00041                      else
00042                      {
00043                             e=n;
00044                      }
00045               }
00046        }
00047 
00048        return uclass;
00049 }