Index: libexif/sources/libexif/olympus/mnote-olympus-entry.c |
=================================================================== |
--- libexif/sources/libexif/olympus/mnote-olympus-entry.c (revision 143189) |
+++ libexif/sources/libexif/olympus/mnote-olympus-entry.c (working copy) |
@@ -76,6 +76,9 @@ |
} \ |
} |
+#define R2L(n) ((n).denominator ? (long)(n).numerator/(n).denominator : 0L) |
+#define R2D(n) ((n).denominator ? (double)(n).numerator/(n).denominator : 0.0) |
+ |
static const struct { |
ExifTag tag; |
ExifFormat fmt; |
@@ -287,6 +290,9 @@ |
if ((!entry->data) && (entry->components > 0)) |
return (v); |
+ if ((!entry->data) && (entry->size > 0)) |
+ return NULL; /* internal inconsistency error */ |
+ |
switch (entry->tag) { |
/* Nikon */ |
@@ -369,20 +375,20 @@ |
CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
CC (entry->components, 4, v, maxlen); |
vr = exif_get_rational (entry->data, entry->order); |
- r = (double)vr.numerator / vr.denominator; |
+ r = R2D(vr); |
vr = exif_get_rational (entry->data+8, entry->order); |
- b = (double)vr.numerator / vr.denominator; |
+ b = R2D(vr); |
snprintf (v, maxlen, _("Red Correction %f, blue Correction %f"), r,b); |
break; |
case MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE: |
CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
CC (entry->components, 1, v, maxlen); |
vr = exif_get_rational (entry->data, entry->order); |
- if (vr.numerator) { |
- r = (double)vr.numerator / vr.denominator; |
+ if (!vr.numerator || !vr.denominator) { |
+ strncpy (v, _("No manual focus selection"), maxlen); |
+ } else { |
+ r = R2D(vr); |
snprintf (v, maxlen, _("%2.2f meters"), r); |
- } else { |
- strncpy (v, _("No manual focus selection"), maxlen); |
} |
break; |
case MNOTE_NIKON_TAG_SENSORPIXELSIZE: |
@@ -390,8 +396,8 @@ |
CC (entry->components, 2, v, maxlen); |
vr = exif_get_rational (entry->data, entry->order); |
vr2 = exif_get_rational (entry->data+8, entry->order); |
- r = (double)vr.numerator / vr.denominator; |
- b = (double)vr2.numerator / vr2.denominator; |
+ r = R2D(vr); |
+ b = R2D(vr2); |
snprintf (v, maxlen, "%2.2f x %2.2f um", r, b); |
break; |
case MNOTE_NIKON_TAG_BRACKETING: |
@@ -447,10 +453,10 @@ |
if (entry->format == EXIF_FORMAT_RATIONAL) { |
CC (entry->components, 1, v, maxlen); |
vr = exif_get_rational (entry->data, entry->order); |
- if (!vr.numerator) { |
+ if (!vr.numerator || !vr.denominator) { |
strncpy (v, _("None"), maxlen); |
} else { |
- r = (double)vr.numerator / vr.denominator; |
+ r = R2D(vr); |
snprintf (v, maxlen, "%2.2f", r); |
} |
break; |
@@ -565,13 +571,13 @@ |
double c,d; |
unsigned long a,b; |
vr = exif_get_rational (entry->data, entry->order); |
- a = vr.numerator / vr.denominator; |
+ a = R2L(vr); |
vr = exif_get_rational (entry->data+8, entry->order); |
- b = vr.numerator / vr.denominator; |
+ b = R2L(vr); |
vr = exif_get_rational (entry->data+16, entry->order); |
- c = (double)vr.numerator / vr.denominator; |
+ c = R2D(vr); |
vr = exif_get_rational (entry->data+24, entry->order); |
- d = (double)vr.numerator / vr.denominator; |
+ d = R2D(vr); |
snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d); |
} |
break; |
@@ -679,7 +685,7 @@ |
CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
CC (entry->components, 1, v, maxlen); |
vr = exif_get_rational (entry->data, entry->order); |
- if (vr.numerator == 0) { |
+ if (!vr.numerator || !vr.denominator) { |
strncpy (v, _("Unknown"), maxlen); |
} |
else { |
@@ -790,7 +796,7 @@ |
if (!vr.denominator) { |
strncpy (v, _("Infinite"), maxlen); |
} else { |
- r = (double)vr.numerator / vr.denominator; |
+ r = R2D(vr); |
snprintf (v, maxlen, "%2.3f", r); |
} |
break; |
@@ -800,7 +806,7 @@ |
if (!vsr.denominator) { |
strncpy (v, _("Infinite"), maxlen); |
} else { |
- r = (double)vsr.numerator / vsr.denominator; |
+ r = R2D(vsr); |
snprintf (v, maxlen, "%2.3f", r); |
} |
break; |