]> git.tdb.fi Git - ttf2png.git/blobdiff - ttf2png.c
Refactor option processing
[ttf2png.git] / ttf2png.c
index 96c325454609bd3d9cf4dfd7556f38b17773e1dc..ae559b106ee14290666ccbf85a79565bd3ca4911 100644 (file)
--- a/ttf2png.c
+++ b/ttf2png.c
@@ -61,7 +61,10 @@ typedef struct sFont
        Image image;
 } Font;
 
-void usage();
+void usage(void);
+int convert_numeric_option(char, int);
+void convert_code_point_range(char, int *, int *);
+void convert_size(char, int *, int *);
 unsigned round_to_pot(unsigned);
 void *alloc_image_data(size_t, size_t);
 int init_font(Font *, FT_Face, unsigned, unsigned, int);
@@ -108,63 +111,19 @@ int main(int argc, char **argv)
 
        while((i = getopt(argc, argv, "r:s:l:c:o:atvh?ed:pim:n:")) != -1)
        {
-               char *ptr;
-               int temp;
                switch(i)
                {
                case 'r':
-                       if(!strcmp(optarg, "all"))
-                       {
-                               begin = 0;
-                               end = 0x110000;
-                       }
-                       else
-                       {
-                               if(!isdigit(optarg[0]))
-                                       temp = -1;
-                               else
-                               {
-                                       temp = strtol(optarg, &ptr, 0);
-                                       if(ptr[0]!=',' || !isdigit(ptr[1]))
-                                               temp = -1;
-                               }
-                               if(temp<0)
-                               {
-                                       printf("Not a valid range: %s\n", optarg);
-                                       exit(1);
-                               }
-                               else
-                               {
-                                       begin = temp;
-                                       end = strtol(ptr+1, NULL, 0);
-                               }
-                       }
+                       convert_code_point_range('r', &begin, &end);
                        break;
                case 's':
-                       size = strtol(optarg, NULL, 0);
+                       size = convert_numeric_option('s', 1);
                        break;
                case 'l':
-                       cpl = strtol(optarg, NULL, 0);
+                       cpl = convert_numeric_option('l', 1);
                        break;
                case 'c':
-                       if(!strcmp(optarg, "auto"))
-                       {
-                               cellw = 0;
-                               cellh = 0;
-                       }
-                       else if(!strcmp(optarg, "autorect"))
-                       {
-                               cellw = 0;
-                               cellh = 1;
-                       }
-                       else
-                       {
-                               cellw = strtol(optarg, &ptr, 0);
-                               if(ptr[0]=='x' && isdigit(ptr[1]))
-                                       cellh = strtol(ptr+1, NULL, 0);
-                               else
-                                       cellh = cellw;
-                       }
+                       convert_size('c', &cellw, &cellh);
                        break;
                case 'o':
                        out_fn = optarg;
@@ -195,10 +154,10 @@ int main(int argc, char **argv)
                        invert = 1;
                        break;
                case 'm':
-                       margin = strtol(optarg, NULL, 0);
+                       margin = convert_numeric_option('m', 0);
                        break;
                case 'n':
-                       padding = strtol(optarg, NULL, 0);
+                       padding = convert_numeric_option('n', 0);
                        break;
                }
        }
@@ -279,32 +238,107 @@ int main(int argc, char **argv)
        return 0;
 }
 
-void usage()
+void usage(void)
 {
        printf("ttf2png 1.1 - True Type Font to PNG converter\n"
-               "Copyright (c) 2004-2008  Mikko Rasa, Mikkosoft Productions\n"
+               "Copyright (c) 2004-2018  Mikko Rasa, Mikkosoft Productions\n"
                "Distributed under the GNU General Public License\n\n");
 
        printf("Usage: ttf2png [options] <TTF file>\n\n");
 
        printf("Accepted options (default values in [brackets])\n"
-               "  -r  Range of characters to convert [0,255]\n"
+               "  -r  Range of code points to convert [0,255]\n"
                "  -s  Font size to use, in pixels [10]\n"
-               "  -l  Number of characters to put in one line [auto]\n"
-               "  -c  Character cell size, in pixels [auto]\n"
+               "  -l  Number of glyphs to put in one line [auto]\n"
+               "  -c  Glyph cell size, in pixels (grid mode only) [auto]\n"
                "  -o  Output file name (or - for stdout) [font.png]\n");
        printf("  -a  Force autohinter\n"
                "  -t  Render glyphs to alpha channel\n"
                "  -i  Invert colors of the glyphs\n"
                "  -v  Increase the level of verbosity\n"
-               "  -e  Use cells in sequence, without gaps\n"
+               "  -e  Use cells in sequence, without gaps (grid mode only)\n"
                "  -p  Pack the glyphs tightly instead of in a grid\n"
-               "  -m  Margin around image edges in packed mode [0]\n"
-               "  -n  Padding between packed glyphs [1]\n"
+               "  -m  Margin around image edges (packed mode only) [0]\n"
+               "  -n  Padding between glyphs (packed mode only) [1]\n"
                "  -d  File name for writing glyph definitions\n"
                "  -h  Print this message\n");
 }
 
+int convert_numeric_option(char opt, int min_value)
+{
+       int value;
+       char *ptr;
+
+       value = strtol(optarg, &ptr, 0);
+       if(value<min_value || *ptr)
+       {
+               printf("Invalid option argument in -%c %s\n", opt, optarg);
+               exit(1);
+       }
+
+       return value;
+}
+
+void convert_code_point_range(char opt, int *begin, int *end)
+{
+       char *ptr;
+
+       if(!strcmp(optarg, "all"))
+       {
+               *begin = 0;
+               *end = 0x10FFFF;
+               return;
+       }
+
+       *begin = strtol(optarg, &ptr, 0);
+       if(*begin>0 && *ptr==',')
+       {
+               *end = strtol(ptr+1, &ptr, 0);
+               if(*end>0 && !*ptr)
+                       return;
+       }
+
+       printf("Invalid option argument in -%c %s\n", opt, optarg);
+       exit(1);
+}
+
+void convert_size(char opt, int *width, int *height)
+{
+       char *ptr;
+
+       if(!strcmp(optarg, "auto"))
+       {
+               *width = 0;
+               *height = 0;
+               return;
+       }
+       else if(!strcmp(optarg, "autorect"))
+       {
+               *width = 0;
+               *height = 1;
+               return;
+       }
+
+       *width = strtol(optarg, &ptr, 0);
+       if(*width>0)
+       {
+               if(*ptr=='x')
+               {
+                       *height = strtol(ptr+1, &ptr, 0);
+                       if(*height>0 && !*ptr)
+                               return;
+               }
+               else if(!*ptr)
+               {
+                       *height = *width;
+                       return;
+               }
+       }
+
+       printf("Invalid option argument in -%c %s\n", opt, optarg);
+       exit(1);
+}
+
 unsigned round_to_pot(unsigned n)
 {
        n -= 1;