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
|