]> git.tdb.fi Git - ttf2png.git/commitdiff
Refactor option processing
authorMikko Rasa <tdb@tdb.fi>
Sat, 14 Apr 2018 11:51:55 +0000 (14:51 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 14 Apr 2018 12:52:36 +0000 (15:52 +0300)
Conversion code was moved to utility functions.  Numeric values are now
checked for being in the proper range and not having garbage at the end.

ttf2png.c

index e8d794c56c6445f4e5780a80272f70ed3a44c321..ae559b106ee14290666ccbf85a79565bd3ca4911 100644 (file)
--- a/ttf2png.c
+++ b/ttf2png.c
@@ -62,6 +62,9 @@ typedef struct sFont
 } Font;
 
 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;
                }
        }
@@ -305,6 +264,81 @@ 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, 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;