From 4fd8c77456f73fb6b30d4ed7125e3990e70a6eed Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 14 Apr 2018 14:51:55 +0300 Subject: [PATCH] Refactor option processing 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 | 134 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 50 deletions(-) diff --git a/ttf2png.c b/ttf2png.c index e8d794c..ae559b1 100644 --- 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(value0 && *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; -- 2.43.0