]> git.tdb.fi Git - ttf2png.git/blobdiff - ttf2png.c
Improve type usage
[ttf2png.git] / ttf2png.c
index e8d794c56c6445f4e5780a80272f70ed3a44c321..d9869bf173671caa4b6908f8f1cd357cb0e978ad 100644 (file)
--- a/ttf2png.c
+++ b/ttf2png.c
@@ -61,11 +61,16 @@ typedef struct sFont
        Image image;
 } Font;
 
+typedef int bool;
+
 void usage(void);
+int convert_numeric_option(char, int);
+void convert_code_point_range(char, unsigned *, unsigned *);
+void convert_size(char, unsigned *, unsigned *);
 unsigned round_to_pot(unsigned);
 void *alloc_image_data(size_t, size_t);
-int init_font(Font *, FT_Face, unsigned, unsigned, int);
-int render_grid(Font *, unsigned, unsigned, unsigned, int);
+int init_font(Font *, FT_Face, unsigned, unsigned, bool);
+int render_grid(Font *, unsigned, unsigned, unsigned, bool);
 int render_packed(Font *, unsigned, unsigned);
 int save_defs(const char *, const Font *);
 int save_png(const char *, const Image *, char);
@@ -75,19 +80,19 @@ char verbose = 0;
 int main(int argc, char **argv)
 {
        char *fn;
-       int begin = 0;
-       int end = 255;
-       int size = 10;
-       int cpl = 0;
-       int cellw = 0;
-       int cellh = 0;
-       char autohinter = 0;
-       char seq = 0;
-       char alpha = 0;
-       char invert = 0;
-       char pack = 0;
-       int margin = 0;
-       int padding = 1;
+       unsigned begin = 0;
+       unsigned end = 255;
+       unsigned size = 10;
+       unsigned cpl = 0;
+       unsigned cellw = 0;
+       unsigned cellh = 0;
+       bool autohinter = 0;
+       bool seq = 0;
+       bool alpha = 0;
+       bool invert = 0;
+       bool pack = 0;
+       unsigned margin = 0;
+       unsigned padding = 1;
 
        FT_Library freetype;
        FT_Face face;
@@ -108,63 +113,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 +156,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;
                }
        }
@@ -305,6 +266,91 @@ void usage(void)
                "  -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, unsigned *begin, unsigned *end)
+{
+       int value;
+       char *ptr;
+
+       if(!strcmp(optarg, "all"))
+       {
+               *begin = 0;
+               *end = 0x10FFFF;
+               return;
+       }
+
+       value = strtol(optarg, &ptr, 0);
+       if(value>0 && *ptr==',')
+       {
+               *begin = value;
+               value = strtol(ptr+1, &ptr, 0);
+               if(value>0 && !*ptr)
+               {
+                       *end = value;
+                       return;
+               }
+       }
+
+       printf("Invalid option argument in -%c %s\n", opt, optarg);
+       exit(1);
+}
+
+void convert_size(char opt, unsigned *width, unsigned *height)
+{
+       int value;
+       char *ptr;
+
+       if(!strcmp(optarg, "auto"))
+       {
+               *width = 0;
+               *height = 0;
+               return;
+       }
+       else if(!strcmp(optarg, "autorect"))
+       {
+               *width = 0;
+               *height = 1;
+               return;
+       }
+
+       value = strtol(optarg, &ptr, 0);
+       if(value>0)
+       {
+               *width = value;
+               if(*ptr=='x')
+               {
+                       value = strtol(ptr+1, &ptr, 0);
+                       if(value>0 && !*ptr)
+                       {
+                               *height = value;
+                               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;
@@ -341,7 +387,7 @@ void *alloc_image_data(size_t a, size_t b)
        return ptr;
 }
 
-int init_font(Font *font, FT_Face face, unsigned first, unsigned last, int autohinter)
+int init_font(Font *font, FT_Face face, unsigned first, unsigned last, bool autohinter)
 {
        unsigned i, j;
        unsigned size = 0;
@@ -456,7 +502,7 @@ int init_font(Font *font, FT_Face face, unsigned first, unsigned last, int autoh
        return 0;
 }
 
-int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, int seq)
+int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, bool seq)
 {
        unsigned i;
        int top = 0, bot = 0;