Back to index

courier  0.68.2
unicode_ultcase.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2000-2003 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 **
00005 */
00006 
00007 #include "unicode_config.h"
00008 #include "unicode.h"
00009 
00010 extern const unsigned unicode_case_hash;
00011 extern const unicode_char unicode_case_tab[][4];
00012 extern const unsigned unicode_case_offset[];
00013 
00014 static unsigned find_case(unicode_char c)
00015 {
00016        unsigned idx= c % unicode_case_hash;
00017 
00018        unsigned i=unicode_case_offset[idx];
00019 
00020        unicode_char uc;
00021 
00022        --i;
00023 
00024        do
00025        {
00026               uc=unicode_case_tab[++i][0];
00027               if (uc == c)
00028                      return (i);
00029        } while ( (uc % unicode_case_hash) == idx);
00030 
00031        return (0);
00032 }
00033 
00034 unicode_char unicode_uc(unicode_char c)
00035 {
00036        unsigned i=find_case(c);
00037 
00038        return (unicode_case_tab[i][0] != c ? c:unicode_case_tab[i][1]);
00039 }
00040 
00041 unicode_char unicode_lc(unicode_char c)
00042 {
00043        unsigned i=find_case(c);
00044 
00045        return (unicode_case_tab[i][0] != c ? c:unicode_case_tab[i][2]);
00046 }
00047 
00048 unicode_char unicode_tc(unicode_char c)
00049 {
00050        unsigned i;
00051        unicode_char oc=c;
00052 
00053        c=unicode_lc(c);
00054        i=find_case(c);
00055 
00056        return (unicode_case_tab[i][0] != c ? oc:unicode_case_tab[i][3]);
00057 }