unifont-7.0.04.tar.gz
[unifont.git] / src / unipagecount.c
index 9b0671f2895b560e20f8460ab43f7370f0cd54eb..b378886cba76dd50c124963870afa68c0ff11db2 100644 (file)
@@ -6,17 +6,18 @@
    Synopsis: unipagecount < font_file.hex > count.txt
              unipagecount -phex_page_num < font_file.hex  -- just 256 points
              unipagecount -h < font_file.hex              -- HTML table
+             unipagecount -P1 -h < font.hex > count.html  -- Plane 1, HTML out
              unipagecount -l < font_file.hex              -- linked HTML table
 
    Author: Paul Hardy, unifoundry <at> unifoundry.com, December 2007
    
-   Copyright (C) 2007, 2008, 2013 Paul Hardy
+   Copyright (C) 2007, 2008, 2013, 2014 Paul Hardy
 
    LICENSE:
 
       This program is free software: you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
-      the Free Software Foundation, either version 3 of the License, or
+      the Free Software Foundation, either version 2 of the License, or
       (at your option) any later version.
 
       This program is distributed in the hope that it will be useful,
 
 #define MAXBUF 256 /* maximum input line size */
 
-int main(int argc, char *argv[]) {
+int
+main (int argc, char *argv[])
+{
 
    char inbuf[MAXBUF]; /* Max 256 characters in an input line */
    int i, j;  /* loop variables */
+   unsigned plane=0; /* Unicode plane number, 0 to 0x16 */
    unsigned page;  /* unicode page (256 bytes wide) */
    unsigned unichar; /* unicode character */
    int pagecount[256] = {256 * 0};
@@ -49,27 +53,33 @@ int main(int argc, char *argv[]) {
    size_t strlen();
 
    if (argc > 1 && argv[1][0] == '-') {  /* Parse option */
-      switch (argv[1][1]) {
-         case 'p':  /* specified -p<hexpage> -- use given page number */
-            sscanf(&argv[1][2], "%x", &pageno);
-            if (pageno >= 0 && pageno <= 255) onepage = 1;
-            break;
-         case 'h':  /* print HTML table instead of text table */
-            html = 1;
-            break;
-         case 'l':  /* print hyperlinks in HTML table */
-            links = 1;
-            html = 1;
-            break;
+      plane = 0;
+      for (i = 1; i < argc; i++) {
+         switch (argv[i][1]) {
+            case 'p':  /* specified -p<hexpage> -- use given page number */
+               sscanf (&argv[1][2], "%x", &pageno);
+               if (pageno >= 0 && pageno <= 255) onepage = 1;
+               break;
+            case 'h':  /* print HTML table instead of text table */
+               html = 1;
+               break;
+            case 'l':  /* print hyperlinks in HTML table */
+               links = 1;
+               html = 1;
+               break;
+            case 'P':  /* Plane number specified */
+               plane = atoi(&argv[1][2]);
+               break;
+         }
       }
    }
    /*
       Initialize pagecount to account for noncharacters.
    */
-   if (!onepage) {
+   if (!onepage && plane==0) {
       pagecount[0xfd] = 32;  /* for U+FDD0..U+FDEF */
-      pagecount[0xff] = 2;   /* for U+FFFE, U+FFFF */
    }
+   pagecount[0xff] = 2;   /* for U+nnFFFE, U+nnFFFF */
    /*
       Read one line at a time from input.  The format is:
 
@@ -81,8 +91,8 @@ int main(int argc, char *argv[]) {
       top to bottom.  The character is assumed to be 16 rows of variable
       width.
    */
-   while (fgets(inbuf, MAXBUF-1, stdin) != NULL) {
-      sscanf(inbuf, "%X", &unichar);
+   while (fgets (inbuf, MAXBUF-1, stdin) != NULL) {
+      sscanf (inbuf, "%X", &unichar);
       page = unichar >> 8;
       if (onepage) { /* only increment counter if this is page we want */
          if (page == pageno) { /* character is in the page we want */
@@ -90,95 +100,108 @@ int main(int argc, char *argv[]) {
          }
       }
       else { /* counting all characters in all pages */
-         /* Don't add in noncharacters (U+FDD0..U+FDEF, U+FFFE, U+FFFF) */
-         if (unichar < 0xfdd0 || (unichar > 0xfdef && unichar < 0xfffe))
-            pagecount[page]++;
+         if (plane == 0) {
+            /* Don't add in noncharacters (U+FDD0..U+FDEF, U+FFFE, U+FFFF) */
+            if (unichar < 0xfdd0 || (unichar > 0xfdef && unichar < 0xfffe))
+               pagecount[page]++;
+         }
+         else {
+            if ((page >> 8) == plane) { /* code point is in desired plane */
+               pagecount[page & 0xFF]++;
+            }
+         }
       }
    }
    if (html) {
-      mkftable(pagecount, links);
+      mkftable (plane, pagecount, links);
    }
    else {  /* Otherwise, print plain text table */
-      fprintf(stdout,
+      if (plane > 0) fprintf (stdout, "  ");
+      fprintf (stdout,
          "   0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n");
       for (i=0; i<0x10; i++) {
-         fprintf(stdout,"%X ", i); /* row header */
+         fprintf (stdout,"%02X%X ", plane, i); /* row header */
          for (j=0; j<0x10; j++) {
             if (onepage) {
                if (pagecount[i*16+j])
-                  fprintf(stdout," *  ");
+                  fprintf (stdout," *  ");
                else
-                  fprintf(stdout," .  ");
+                  fprintf (stdout," .  ");
             }
             else {
-               fprintf(stdout, "%3X ", pagecount[i*16+j]);
+               fprintf (stdout, "%3X ", pagecount[i*16+j]);
             }
          }
-         fprintf(stdout,"\n");
+         fprintf (stdout,"\n");
       }
    
    }
-   exit(0);
+   exit (0);
 }
 
 
 /*
-   mkftable - function to create an HTML table to show flipped bmp files
+   mkftable - function to create an HTML table to show PNG files
               in a 16 by 16 grid.
 */
 
-void mkftable(int pagecount[256], int links) {
+void
+mkftable (unsigned plane, int pagecount[256], int links)
+{
    int i, j;
    int count;
    unsigned bgcolor;
    
-   printf("<html>\n");
-   printf("<body>\n");
-   printf("<table border=\"3\" align=\"center\">\n");
-   printf("  <tr><th colspan=\"16\" bgcolor=\"#ffcc80\">");
-   printf("GNU Unifont Page Coverage<br>(Green=100%%, Red=0%%)</th></tr>\n");
+   printf ("<html>\n");
+   printf ("<body>\n");
+   printf ("<table border=\"3\" align=\"center\">\n");
+   printf ("  <tr><th colspan=\"16\" bgcolor=\"#ffcc80\">");
+   printf ("GNU Unifont Glyphs<br>with Page Coverage for Plane %d<br>(Green=100%%, Red=0%%)</th></tr>\n", plane);
    for (i = 0x0; i <= 0xF; i++) {
-      printf("  <tr>\n");
+      printf ("  <tr>\n");
       for (j = 0x0; j <= 0xF; j++) {
          count = pagecount[ (i << 4) | j ];
          
          /* print link in cell if links == 1 */
-         if (i < 0xd || (i == 0xd && j < 0x8) || (i == 0xf && j > 0x8)) {
+         if (plane != 0 || (i < 0xd || (i == 0xd && j < 0x8) || (i == 0xf && j > 0x8))) {
             /* background color is light green if completely done */
             if (count == 0x100) bgcolor = 0xccffcc;
             /* otherwise background is a shade of yellow to orange to red */
             else bgcolor = 0xff0000 | (count << 8) | (count >> 1);
-            printf("    <td bgcolor=\"#%06X\">", bgcolor);
-            printf("<a href=\"bmp/uni%X%X.bmp\">%X%X</a>", i, j, i, j);
-            printf("</td>\n");
+            printf ("    <td bgcolor=\"#%06X\">", bgcolor);
+            if (plane == 0)
+               printf ("<a href=\"png/plane%02X/uni%02X%X%X.png\">%X%X</a>", plane, plane, i, j, i, j);
+            else
+               printf ("<a href=\"png/plane%02X/uni%02X%X%X.png\">%02X%X%X</a>", plane, plane, i, j, plane, i, j);
+            printf ("</td>\n");
          }
          else if (i == 0xd) {
             if (j == 0x8) {
-               printf("    <td align=\"center\" colspan=\"8\" bgcolor=\"#cccccc\">");
-               printf("<b>Surrogate Pairs</b>");
-               printf("</td>\n");
+               printf ("    <td align=\"center\" colspan=\"8\" bgcolor=\"#cccccc\">");
+               printf ("<b>Surrogate Pairs</b>");
+               printf ("</td>\n");
             }  /* otherwise don't print anything more columns in this row */
          }
          else if (i == 0xe) {
             if (j == 0x0) {
-               printf("    <td align=\"center\" colspan=\"16\" bgcolor=\"#cccccc\">");
-               printf("<b>Private Use</b>");
-               printf("</td>\n");
+               printf ("    <td align=\"center\" colspan=\"16\" bgcolor=\"#cccccc\">");
+               printf ("<b>Private Use</b>");
+               printf ("</td>\n");
             }  /* otherwise don't print any more columns in this row */
          }
          else if (i == 0xf) {
             if (j == 0x0) {
-               printf("    <td align=\"center\" colspan=\"9\" bgcolor=\"#cccccc\">");
-               printf("<b>Private Use</b>");
-               printf("</td>\n");
+               printf ("    <td align=\"center\" colspan=\"9\" bgcolor=\"#cccccc\">");
+               printf ("<b>Private Use</b>");
+               printf ("</td>\n");
             }
          }
       }
-      printf("  </tr>\n");
+      printf ("  </tr>\n");
    }
-   printf("</table>\n");
-   printf("</body>\n");
-   printf("</html>\n");
+   printf ("</table>\n");
+   printf ("</body>\n");
+   printf ("</html>\n");
 
    return;
 }