1/* Test of uc_width() function. 2 Copyright (C) 2007-2010 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17/* Written by Bruno Haible <bruno@clisp.org>, 2008. */ 18 19#include <config.h> 20 21#include "uniwidth.h" 22 23#include <stdio.h> 24 25#include "macros.h" 26 27/* One of 0, '0', '1', 'A', '2'. */ 28static char current_width; 29/* The interval for which the current_width holds. */ 30static ucs4_t current_start; 31static ucs4_t current_end; 32 33static void 34finish_interval (void) 35{ 36 if (current_width != 0) 37 { 38 if (current_start == current_end) 39 printf ("%04X\t\t%c\n", (unsigned) current_start, current_width); 40 else 41 printf ("%04X..%04X\t%c\n", (unsigned) current_start, 42 (unsigned) current_end, current_width); 43 current_width = 0; 44 } 45} 46 47static void 48add_to_interval (ucs4_t uc, char width) 49{ 50 if (current_width == width && uc == current_end + 1) 51 current_end = uc; 52 else 53 { 54 finish_interval (); 55 current_width = width; 56 current_start = current_end = uc; 57 } 58} 59 60int 61main () 62{ 63 ucs4_t uc; 64 65 for (uc = 0; uc < 0x110000; uc++) 66 { 67 int w1 = uc_width (uc, "UTF-8"); 68 int w2 = uc_width (uc, "GBK"); 69 char width = 70 (w1 == 0 && w2 == 0 ? '0' : 71 w1 == 1 && w2 == 1 ? '1' : 72 w1 == 1 && w2 == 2 ? 'A' : 73 w1 == 2 && w2 == 2 ? '2' : 74 0); 75 if (width == 0) 76 { 77 /* uc must be a control character. */ 78 ASSERT (w1 < 0 && w2 < 0); 79 } 80 else 81 add_to_interval (uc, width); 82 } 83 finish_interval (); 84 85 return 0; 86} 87