49#define PIKTO_START 0x0F0E70    
   50#define PIKTO_END   0x0F11EF    
   52#define PIKTO_SIZE  (PIKTO_END - PIKTO_START + 1) 
   63main (
int argc, 
char **argv)
 
   72   char glyph_width[0x20000];
 
   78      fprintf (stderr, 
"\n\nUsage: %s <unifont.hex> <combining.txt>\n\n", argv[0]);
 
   85   if ((infilefp = fopen (argv[1],
"r")) == NULL) {
 
   86      fprintf (stderr,
"ERROR - hex input file %s not found.\n\n", argv[1]);
 
   91   memset (glyph_width, -1, 0x20000 * 
sizeof (
char));
 
   92   memset (pikto_width, -1, (
PIKTO_SIZE) * 
sizeof (
char));
 
   95   while (fgets (teststring, 
MAXSTRING-1, infilefp) != NULL) {
 
   96      sscanf (teststring, 
"%X:%*s", &loc);
 
   98         gstart = strchr (teststring,
':') + 1;
 
  103         glyph_width[loc] = (strlen (gstart) - 1) >> 5;
 
  106         gstart = strchr (teststring,
':') + 1;
 
  107         pikto_width[loc - 
PIKTO_START] = strlen (gstart) <= 34 ? 1 : 2;
 
  116   if ((infilefp = fopen (argv[2],
"r")) == NULL) {
 
  117      fprintf (stderr,
"ERROR - combining characters file %s not found.\n\n", argv[2]);
 
  121   while (fgets (teststring, 
MAXSTRING-1, infilefp) != NULL) {
 
  122      sscanf (teststring, 
"%X:%*s", &loc);
 
  123      if (loc < 0x20000) glyph_width[loc] = 0;
 
  212   for (i = 0xFDD0; i <= 0xFDEF; i++) glyph_width[i] = -1;
 
  213   glyph_width[0xFFFE] = -1; 
 
  214   glyph_width[0xFFFF] = -1; 
 
  217   for (i = 0xD800; i <= 0xDFFF; i++) glyph_width[i]=-1;
 
  220   for (i = 0x4E00; i <= 0x9FFF; i++) 
if (glyph_width[i] < 0) glyph_width[i] = 2;
 
  221   for (i = 0x3400; i <= 0x4DBF; i++) 
if (glyph_width[i] < 0) glyph_width[i] = 2;
 
  222   for (i = 0xF900; i <= 0xFAFF; i++) 
if (glyph_width[i] < 0) glyph_width[i] = 2;
 
  228   printf (
"   wcwidth and wcswidth functions, as per IEEE 1003.1-2008\n");
 
  229   printf (
"   System Interfaces, pp. 2241 and 2251.\n\n");
 
  230   printf (
"   Author: Paul Hardy, 2013\n\n");
 
  231   printf (
"   Copyright (c) 2013 Paul Hardy\n\n");
 
  232   printf (
"   LICENSE:\n");
 
  234   printf (
"      This program is free software: you can redistribute it and/or modify\n");
 
  235   printf (
"      it under the terms of the GNU General Public License as published by\n");
 
  236   printf (
"      the Free Software Foundation, either version 2 of the License, or\n");
 
  237   printf (
"      (at your option) any later version.\n");
 
  239   printf (
"      This program is distributed in the hope that it will be useful,\n");
 
  240   printf (
"      but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
 
  241   printf (
"      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n");
 
  242   printf (
"      GNU General Public License for more details.\n");
 
  244   printf (
"      You should have received a copy of the GNU General Public License\n");
 
  245   printf (
"      along with this program.  If not, see <http://www.gnu.org/licenses/>.\n");
 
  248   printf (
"#include <wchar.h>\n\n");
 
  249   printf (
"/* Definitions for Pikto CSUR Private Use Area glyphs */\n");
 
  250   printf (
"#define PIKTO_START\t0x%06X\n", 
PIKTO_START);
 
  251   printf (
"#define PIKTO_END\t0x%06X\n", 
PIKTO_END);
 
  252   printf (
"#define PIKTO_SIZE\t(PIKTO_END - PIKTO_START + 1)\n");
 
  254   printf (
"/* wcwidth -- return charcell positions of one code point */\n");
 
  255   printf (
"inline int\nwcwidth (wchar_t wc)\n{\n");
 
  256   printf (
"   return (wcswidth (&wc, 1));\n");
 
  259   printf (
"int\nwcswidth (const wchar_t *pwcs, size_t n)\n{\n\n");
 
  260   printf (
"   int i;                    /* loop variable                                      */\n");
 
  261   printf (
"   unsigned codept;          /* Unicode code point of current character            */\n");
 
  262   printf (
"   unsigned plane;           /* Unicode plane, 0x00..0x10                          */\n");
 
  263   printf (
"   unsigned lower17;         /* lower 17 bits of Unicode code point                */\n");
 
  264   printf (
"   unsigned lower16;         /* lower 16 bits of Unicode code point                */\n");
 
  265   printf (
"   int lowpt, midpt, highpt; /* for binary searching in plane1zeroes[]             */\n");
 
  266   printf (
"   int found;                /* for binary searching in plane1zeroes[]             */\n");
 
  267   printf (
"   int totalwidth;           /* total width of string, in charcells (1 or 2/glyph) */\n");
 
  268   printf (
"   int illegalchar;          /* Whether or not this code point is illegal          */\n");
 
  275   printf (
"   char glyph_width[0x20000] = {");
 
  276   for (i = 0; i < 0x10000; i++) {
 
  278         printf (
"\n      /* U+%04X */ ", i);
 
  279      printf (
"%d,", glyph_width[i]);
 
  281   for (i = 0x10000; i < 0x20000; i++) {
 
  283         printf (
"\n      /* U+%06X */ ", i);
 
  284      printf (
"%d", glyph_width[i]);
 
  285      if (i < 0x1FFFF) putchar (
',');
 
  287   printf (
"\n   };\n\n");
 
  292   printf (
"   char pikto_width[PIKTO_SIZE] = {");
 
  296      printf (
"%d", pikto_width[i]);
 
  299   printf (
"\n   };\n\n");
 
  305   printf (
"   illegalchar = totalwidth = 0;\n");
 
  306   printf (
"   for (i = 0; !illegalchar && i < n; i++) {\n");
 
  307   printf (
"      codept  = pwcs[i];\n");
 
  308   printf (
"      plane   = codept >> 16;\n");
 
  309   printf (
"      lower17 = codept & 0x1FFFF;\n");
 
  310   printf (
"      lower16 = codept & 0xFFFF;\n");
 
  311   printf (
"      if (plane < 2) { /* the most common case */\n");
 
  312   printf (
"         if (glyph_width[lower17] < 0) illegalchar = 1;\n");
 
  313   printf (
"         else totalwidth += glyph_width[lower17];\n");
 
  315   printf (
"      else { /* a higher plane or beyond Unicode range */\n");
 
  316   printf (
"         if  ((lower16 == 0xFFFE) || (lower16 == 0xFFFF)) {\n");
 
  317   printf (
"            illegalchar = 1;\n");
 
  319   printf (
"         else if (plane < 4) {  /* Ideographic Plane */\n");
 
  320   printf (
"            totalwidth += 2; /* Default ideographic width */\n");
 
  322   printf (
"         else if (plane == 0x0F) {  /* CSUR Private Use Area */\n");
 
  323   printf (
"            if (lower16 <= 0x0E6F) { /* Kinya */\n");
 
  324   printf (
"               totalwidth++; /* all Kinya syllables have width 1 */\n");
 
  326   printf (
"            else if (lower16 <= (PIKTO_END & 0xFFFF)) { /* Pikto */\n");
 
  327   printf (
"               if (pikto_width[lower16 - (PIKTO_START & 0xFFFF)] < 0) illegalchar = 1;\n");
 
  328   printf (
"               else totalwidth += pikto_width[lower16 - (PIKTO_START & 0xFFFF)];\n");
 
  331   printf (
"         else if (plane > 0x10) {\n");
 
  332   printf (
"            illegalchar = 1;\n");
 
  334   printf (
"         /* Other non-printing in higher planes; return -1 as per IEEE 1003.1-2008. */\n");
 
  335   printf (
"         else if (/* language tags */\n");
 
  336   printf (
"                  codept == 0x0E0001 || (codept >= 0x0E0020 && codept <= 0x0E007F) ||\n");
 
  337   printf (
"                  /* variation selectors, 0x0E0100..0x0E01EF */\n");
 
  338   printf (
"                  (codept >= 0x0E0100 && codept <= 0x0E01EF)) {\n");
 
  339   printf (
"            illegalchar = 1;\n");
 
  342   printf (
"            Unicode plane 0x02..0x10 printing character\n");
 
  344   printf (
"         else {\n");
 
  345   printf (
"            illegalchar = 1; /* code is not in font */\n");
 
  350   printf (
"   if (illegalchar) totalwidth = -1;\n");
 
  352   printf (
"   return (totalwidth);\n");
 
int main()
The main function.
#define MAXSTRING
Maximum input line length - 1.
#define PIKTO_START
Start of Pikto code point range.
#define PIKTO_END
End of Pikto code point range.