Back to index

courier  0.68.2
unicode_wcwidth.c
Go to the documentation of this file.
00001 #include "unicode_config.h"
00002 #include "unicode.h"
00003 
00004 #include "eastasianwidth.h"
00005 #include "linebreaktab_internal.h"
00006 
00007 #include <stdlib.h>
00008 
00009 int unicode_wcwidth(unicode_char c)
00010 {
00011        size_t b=0;
00012        size_t e=sizeof(unicode_wcwidth_tab)/sizeof(unicode_wcwidth_tab[0]);
00013 
00014        while (b < e)
00015        {
00016               size_t n=b + (e-b)/2;
00017 
00018               if (c >= unicode_wcwidth_tab[n][0])
00019               {
00020                      if (c <= unicode_wcwidth_tab[n][1])
00021                             return 2;
00022                      b=n+1;
00023               }
00024               else
00025               {
00026                      e=n;
00027               }
00028        }
00029 
00030        switch (unicode_lb_lookup(c)) {
00031        case UNICODE_LB_BK:
00032        case UNICODE_LB_CR:
00033        case UNICODE_LB_LF:
00034        case UNICODE_LB_CM:
00035        case UNICODE_LB_NL:
00036        case UNICODE_LB_WJ:
00037        case UNICODE_LB_ZW:
00038               return 0;
00039        default:
00040               break;
00041        }
00042        return 1;
00043 }
00044 
00045 int unicode_isspace(unicode_char ch)
00046 {
00047        if (ch == 9)
00048               return 1;
00049 
00050        switch (unicode_lb_lookup(ch)) {
00051        case UNICODE_LB_BK:
00052        case UNICODE_LB_CR:
00053        case UNICODE_LB_LF:
00054        case UNICODE_LB_NL:
00055        case UNICODE_LB_SP:
00056               return 1;
00057        }
00058 
00059        return 0;
00060 }
00061 
00062 size_t unicode_wcwidth_str(const unicode_char *c)
00063 {
00064        size_t w=0;
00065 
00066        while (*c)
00067               w += unicode_wcwidth(*c++);
00068 
00069 
00070        return w;
00071 }