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
    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
    
              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
 
    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,
       (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 */
 
 
 #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 */
 
    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};
    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 */
    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.
    */
       }
    }
    /*
       Initialize pagecount to account for noncharacters.
    */
-   if (!onepage) {
+   if (!onepage && plane==0) {
       pagecount[0xfd] = 32;  /* for U+FDD0..U+FDEF */
       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:
 
    /*
       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.
    */
       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 */
       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 */
          }
       }
       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) {
       }
    }
    if (html) {
-      mkftable(pagecount, links);
+      mkftable (plane, pagecount, links);
    }
    else {  /* Otherwise, print plain text table */
    }
    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++) {
          "   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])
          for (j=0; j<0x10; j++) {
             if (onepage) {
                if (pagecount[i*16+j])
-                  fprintf(stdout," *  ");
+                  fprintf (stdout," *  ");
                else
                else
-                  fprintf(stdout," .  ");
+                  fprintf (stdout," .  ");
             }
             else {
             }
             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.
 */
 
               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;
    
    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++) {
    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 */
       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);
             /* 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) {
          }
          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) {
             }  /* 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) {
             }  /* 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;
 }
 
    return;
 }