From: Lutz M. <lu...@us...> - 2008-02-10 09:20:27
|
Update of /cvsroot/libexif/exif/exif In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv20512/exif Modified Files: utils.c Log Message: 2008-02-10 Lutz Mueller <lu...@us...> Patch by Alexander Drozdov <dza...@mt...>: * exif/utils.c (exif_tag_from_string): Speed improvements. Index: utils.c =================================================================== RCS file: /cvsroot/libexif/exif/exif/utils.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -p -d -r1.9 -r1.10 --- utils.c 27 Apr 2005 06:44:22 -0000 1.9 +++ utils.c 10 Feb 2008 09:20:17 -0000 1.10 @@ -23,104 +23,37 @@ #include <string.h> #include <stdlib.h> +#include <stdio.h> ExifTag exif_tag_from_string (const char *string) { ExifTag tag; - unsigned int i, number, factor; + unsigned int i, number; const char *name; if (!string) return 0xffff; - /* Is the string a tag's name or title? */ - for (tag = 0xffff; tag > 0; tag--) { - name = exif_tag_get_name (tag); - if (name && !strcmp (string, name)) - return (tag); - name = exif_tag_get_title (tag); - if (name && !strcmp (string, name)) - return (tag); - } - /* Is the string a decimal number? */ if (strspn (string, "0123456789") == strlen (string)) return (atoi (string)); /* Is the string a hexadecimal number? */ - for (i = 0; i < strlen (string); i++) - if (string[i] == 'x') - break; - if (i == strlen (string)) - return 0xffff; + if (sscanf (string, "0x%x%n", &number, &i) == 1 && !string[i]) + return ((ExifTag)number); - string += i + 1; - tag = 0; - for (i = strlen (string); i > 0; i--) { - switch (string[i - 1]) { - case '0': - number = 0; - break; - case '1': - number = 1; - break; - case '2': - number = 2; - break; - case '3': - number = 3; - break; - case '4': - number = 4; - break; - case '5': - number = 5; - break; - case '6': - number = 6; - break; - case '7': - number = 7; - break; - case '8': - number = 8; - break; - case '9': - number = 9; - break; - case 'a': - case 'A': - number = 10; - break; - case 'b': - case 'B': - number = 11; - break; - case 'c': - case 'C': - number = 12; - break; - case 'd': - case 'D': - number = 13; - break; - case 'e': - case 'E': - number = 14; - break; - case 'f': - case 'F': - number = 15; - break; - default: - return (0); - } - factor = 1 << ((strlen (string) - i) * 4); - tag += (number * factor); - } + /* Is the string a tag's name? */ + if ((tag = exif_tag_from_name (string)) != 0) + return (tag); - return (tag); + /* Is the string a tag's title? */ + for (tag = 0xffff; (int)tag > 0; tag--) { + name = exif_tag_get_title (tag); + if (name && !strcmp (string, name)) + return (tag); + } + return (0xffff); } ExifIfd |