X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=ttf2png.c;h=15b554dbfc22291797830264a38d537269fe3b96;hb=93e12905d88f591c6894777a8409e75118e540e8;hp=d9869bf173671caa4b6908f8f1cd357cb0e978ad;hpb=f506acab628d313bb2e140ec936dc8970ba2f0d0;p=ttf2png.git diff --git a/ttf2png.c b/ttf2png.c index d9869bf..15b554d 100644 --- a/ttf2png.c +++ b/ttf2png.c @@ -66,6 +66,7 @@ typedef int bool; void usage(void); int convert_numeric_option(char, int); void convert_code_point_range(char, unsigned *, unsigned *); +unsigned str_to_code_point(const char *, char **); void convert_size(char, unsigned *, unsigned *); unsigned round_to_pot(unsigned); void *alloc_image_data(size_t, size_t); @@ -293,11 +294,11 @@ void convert_code_point_range(char opt, unsigned *begin, unsigned *end) return; } - value = strtol(optarg, &ptr, 0); + value = str_to_code_point(optarg, &ptr); if(value>0 && *ptr==',') { *begin = value; - value = strtol(ptr+1, &ptr, 0); + value = str_to_code_point(ptr+1, &ptr); if(value>0 && !*ptr) { *end = value; @@ -309,6 +310,44 @@ void convert_code_point_range(char opt, unsigned *begin, unsigned *end) exit(1); } +unsigned str_to_code_point(const char *nptr, char **endptr) +{ + if(nptr[0]=='U' && nptr[1]=='+') + return strtoul(nptr+2, endptr, 16); + else if(nptr[0]&0x80) + { + unsigned bytes; + unsigned code; + unsigned i; + + if(endptr) + *endptr = (char *)nptr; + + for(bytes=1; (bytes<4 && (nptr[0]&(0x80>>bytes))); ++bytes) + if((nptr[bytes]&0xC0)!=0x80) + return 0; + if(bytes<2) + return 0; + + code = nptr[0]&(0x3F>>bytes); + for(i=1; i