exif_mnote_data_canon_get_value(), mnote_canon_entry_get_value():
authorJan Patera <patera@pictview.com>
Wed, 7 Jan 2004 14:53:04 +0000 (15:53 +0100)
committerJan Patera <patera@pictview.com>
Wed, 7 Jan 2004 14:53:04 +0000 (15:53 +0100)
1) 2 new args value & maxlen
2) no static variables
3) does not duplicate string on return

libexif/canon/exif-mnote-data-canon.c
libexif/canon/mnote-canon-entry.c
libexif/canon/mnote-canon-entry.h

index d76110c..b70a121 100644 (file)
@@ -60,13 +60,13 @@ exif_mnote_data_canon_free (ExifMnoteData *n)
 }
 
 static char *
-exif_mnote_data_canon_get_value (ExifMnoteData *note, unsigned int n)
+exif_mnote_data_canon_get_value (ExifMnoteData *note, unsigned int n, char *val, unsigned int maxlen)
 {
-        ExifMnoteDataCanon *cnote = (ExifMnoteDataCanon *) note;
+       ExifMnoteDataCanon *cnote = (ExifMnoteDataCanon *) note;
 
        if (!note) return NULL;
        if (cnote->count <= n) return NULL;
-       return mnote_canon_entry_get_value (&cnote->entries[n]);
+       return mnote_canon_entry_get_value (&cnote->entries[n], val, maxlen);
 }
 
 static void
@@ -164,13 +164,13 @@ exif_mnote_data_canon_save (ExifMnoteData *ne,
        memset (*buf, 0, sizeof (char) * *buf_size);
 
        /* Save the number of entries */
-       exif_set_short (*buf, n->order, n->count);
+       exif_set_short (*buf, n->order, (ExifShort) n->count);
        
        /* Save each entry */
        for (i = 0; i < n->count; i++) {
                o = 2 + i * 12;
-               exif_set_short (*buf + o + 0, n->order, n->entries[i].tag);
-               exif_set_short (*buf + o + 2, n->order, n->entries[i].format);
+               exif_set_short (*buf + o + 0, n->order, (ExifShort) n->entries[i].tag);
+               exif_set_short (*buf + o + 2, n->order, (ExifShort) n->entries[i].format);
                exif_set_long  (*buf + o + 4, n->order,
                                n->entries[i].components);
                o += 8;
index 9804568..bdb1031 100644 (file)
 #undef  MIN
 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
 
-#define CF(format,target,v)                                     \
+#define CF(format,target,v,maxlen)                              \
 {                                                               \
         if (format != target) {                                 \
-                snprintf (v, sizeof (v),                        \
+                snprintf (v, maxlen,                            \
                         _("Invalid format '%s', "               \
                         "expected '%s'."),                      \
                         exif_format_get_name (format),          \
         }                                                       \
 }
 
-#define CC(number,target,v)                                             \
+#define CC(number,target,v,maxlen)                                      \
 {                                                                       \
         if (number != target) {                                         \
-                snprintf (v, sizeof (v),                                \
+                snprintf (v, maxlen,                                    \
                         _("Invalid number of components (%i, "          \
                         "expected %i)."), (int) number, (int) target);  \
                 break;                                                  \
         }                                                               \
 }
-#define CC2(number,t1,t2,v)                                             \
+#define CC2(number,t1,t2,v,maxlen)                                      \
 {                                                                       \
        if ((number != t1) && (number != t2)) {                         \
-               snprintf (v, sizeof (v),                                \
+               snprintf (v, maxlen,                                    \
                        _("Invalid number of components (%i, "          \
                        "expected %i or %i)."), (int) number,           \
                        (int) t1, (int) t2);                            \
 }
 
 char *
-mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
+mnote_canon_entry_get_value (const MnoteCanonEntry *entry, char *val, unsigned int maxlen)
 {
-        char v[1024], buf[1024];
-        ExifLong vl;
-        ExifShort vs, n;
-       int i;
-       unsigned char *data = entry->data;
+    char buf[128];
+    ExifLong vl;
+    ExifShort vs, n;
+    int i;
+    unsigned char *data = entry->data;
 
-        if (!entry) return NULL;
+    if (!entry) return NULL;
+
+    memset (val, 0, maxlen);
+    maxlen--;
 
-        memset (v, 0, sizeof (v));
        switch (entry->tag) {
        case MNOTE_CANON_TAG_SETTINGS_1:
-               CF (entry->format, EXIF_FORMAT_SHORT, v);
+               CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen);
                n = exif_get_short (data, entry->order) / 2;
                data += 2;
-               CC (entry->components, n, v);
+               CC (entry->components, n, val, maxlen);
                for (i = 1; i < n; i++) {
                    vs = exif_get_short (data, entry->order);
                    data += 2;
                    switch (i) {
                    case 1:
-                       strncpy (v, _("Macro mode : "), sizeof (v) - 1);
+                       strncpy (val, _("Macro mode : "), maxlen);
                        switch (vs) {
                        case 1:
-                           strncat (v, _("Macro"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Macro"), maxlen - strlen(val));
                            break;
                        case 2:
-                           strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Normal"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 2:
                        if (vs) {
                                snprintf (buf, sizeof (buf),
                                        _(" / Self Timer : %i (ms)"), vs*100);
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 4:
-                       strncat (v,_(" / Flash mode : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Flash mode : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0:
-                           strncat (v, _("Flash not fired"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Flash not fired"), maxlen - strlen(val));
                            break;
                        case 1:
-                           strncat (v, _("auto"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("auto"), maxlen - strlen(val));
                            break;
                        case 2:
-                           strncat (v, _("on"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("on"), maxlen - strlen(val));
                            break;
                        case 3:
-                           strncat (v, _("red eyes reduction"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("red eyes reduction"), maxlen - strlen(val));
                            break;
                        case 4:
-                           strncat (v, _("slow synchro"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("slow synchro"), maxlen - strlen(val));
                            break;
                        case 5:
-                           strncat (v, _("auto + red eyes reduction"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("auto + red eyes reduction"), maxlen - strlen(val));
                            break;
                        case 6:
-                           strncat (v, _("on + red eyes reduction"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("on + red eyes reduction"), maxlen - strlen(val));
                            break;
                        case 16:
-                           strncat (v, _("external"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("external"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 5:
-                       strncat (v, _(" / Continuous drive mode : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Continuous drive mode : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0:
-                           strncat (v, _("single or timer"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("single or timer"), maxlen - strlen(val));
                            break;
                        case 1:
-                           strncat (v, _("continuous"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("continuous"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v, buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 7:
-                       strncat (v, _(" / Focus mode : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Focus mode : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0:
-                           strncat (v, _("One-Shot"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("One-Shot"), maxlen - strlen(val));
                            break;
                        case 1:
-                           strncat (v, _("AI Servo"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("AI Servo"), maxlen - strlen(val));
                            break;
                        case 2:
-                           strncat (v, _("AI Focus"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("AI Focus"), maxlen - strlen(val));
                            break;
                        case 3:
-                           strncat (v, _("MF"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("MF"), maxlen - strlen(val));
                            break;
                        case 4:
-                           strncat (v, _("Single"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Single"), maxlen - strlen(val));
                            break;
                        case 5:
-                           strncat (v, _("Continuous"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Continuous"), maxlen - strlen(val));
                            break;
                        case 6:
-                           strncat (v, _("MF"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("MF"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 10:
-                       strncat (v, _(" / Image size : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Image size : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0:
-                           strncat (v, _("Large"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Large"), maxlen - strlen(val));
                            break;
                        case 1:
-                           strncat (v, _("Medium"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Medium"), maxlen - strlen(val));
                            break;
                        case 2:
-                           strncat (v, _("Small"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Small"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 11:
-                       strncat (v, _(" / Easy shooting mode : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Easy shooting mode : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0:
-                           strncat (v, _("Full Auto"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Full Auto"), maxlen - strlen(val));
                            break;
                        case 1:
-                           strncat (v, _("Manual"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Manual"), maxlen - strlen(val));
                            break;
                        case 2:
-                           strncat (v, _("Landscape"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Landscape"), maxlen - strlen(val));
                            break;
                        case 3:
-                           strncat (v, _("Fast Shutter"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Fast Shutter"), maxlen - strlen(val));
                            break;
                        case 4:
-                           strncat (v, _("Slow Shutter"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Slow Shutter"), maxlen - strlen(val));
                            break;
                        case 5:
-                           strncat (v, _("Night"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Night"), maxlen - strlen(val));
                            break;
                        case 6:
-                           strncat (v, _("Black & White"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Black & White"), maxlen - strlen(val));
                            break;
                        case 7:
-                           strncat (v, _("Sepia"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Sepia"), maxlen - strlen(val));
                            break;
                        case 8:
-                           strncat (v, _("Portrait"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Portrait"), maxlen - strlen(val));
                            break;
                        case 9:
-                           strncat (v, _("Sports"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Sports"), maxlen - strlen(val));
                            break;
                        case 10:
-                           strncat (v, _("Macro / Close-Up"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Macro / Close-Up"), maxlen - strlen(val));
                            break;
                        case 11:
-                           strncat (v, _("Pan Focus"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Pan Focus"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 13:
-                       strncat (v, _(" / Contrast : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Contrast : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0xffff:
-                           strncat (v, _("Low"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Low"), maxlen - strlen(val));
                            break;
                        case 0x0000:
-                           strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Normal"), maxlen - strlen(val));
                            break;
                        case 0x0001:
-                           strncat (v, _("High"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("High"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 14:
-                       strncat (v, _(" / Saturation : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Saturation : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0xffff:
-                           strncat (v, _("Low"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Low"), maxlen - strlen(val));
                            break;
                        case 0x0000:
-                           strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Normal"), maxlen - strlen(val));
                            break;
                        case 0x0001:
-                           strncat (v, _("High"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("High"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 15:
-                       strncat (v, _(" / Sharpness : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Sharpness : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0xffff:
-                           strncat (v, _("Low"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Low"), maxlen - strlen(val));
                            break;
                        case 0x0000:
-                           strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Normal"), maxlen - strlen(val));
                            break;
                        case 0x0001:
-                           strncat (v, _("High"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("High"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 16:
                        if (vs) {
-                           strncat (v, _(" / ISO : "), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _(" / ISO : "), maxlen - strlen(val));
                            switch (vs) {
                            case 15:
-                               strncat (v, _("auto"), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _("auto"), maxlen - strlen(val));
                                break;
                            case 16:
-                               strncat (v, _("50"), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _("50"), maxlen - strlen(val));
                                break;
                            case 17:
-                               strncat (v, _("100"), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _("100"), maxlen - strlen(val));
                                break;
                            case 18:
-                               strncat (v, _("200"), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _("200"), maxlen - strlen(val));
                                break;
                            case 19:
-                               strncat (v, _("400"), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _("400"), maxlen - strlen(val));
                                break;
                            default:
-                               snprintf (buf, sizeof (buf), "%i???", vs);
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               snprintf (buf, sizeof (buf), _("%i???"), vs);
+                               strncat (val, buf, maxlen - strlen(val));
                            }
                            break;
                        }
                    case 17:
-                       strncat (v, _(" / Metering mode : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / Metering mode : "), maxlen - strlen(val));
                        switch (vs) {
                        case 3:
-                           strncat (v, _("Evaluative"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Evaluative"), maxlen - strlen(val));
                            break;
                        case 4:
-                           strncat (v, _("Partial"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Partial"), maxlen - strlen(val));
                            break;
                        case 5:
-                           strncat (v, _("Center-weighted"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("Center-weighted"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "%i???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("%i???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 19:
-                       strncat (v, _(" / AF point selected : "), sizeof (v) - 1 - strlen(v));
+                       strncat (val, _(" / AF point selected : "), maxlen - strlen(val));
                        switch (vs) {
                        case 0x3000:
-                           strncat (v, _("none (MF)"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("none (MF)"), maxlen - strlen(val));
                            break;
                        case 0x3001:
-                           strncat (v, _("auto-selected"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("auto-selected"), maxlen - strlen(val));
                            break;
                        case 0x3002:
-                           strncat (v, _("right"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("right"), maxlen - strlen(val));
                            break;
                        case 0x3003:
-                           strncat (v, _("center"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("center"), maxlen - strlen(val));
                            break;
                        case 0x3004:
-                           strncat (v, _("left"), sizeof (v) - 1 - strlen(v));
+                           strncat (val, _("left"), maxlen - strlen(val));
                            break;
                        default:
-                           snprintf (buf, sizeof (buf), "0x%x???", vs);
-                           strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                           snprintf (buf, sizeof (buf), _("0x%x???"), vs);
+                           strncat (val, buf, maxlen - strlen(val));
                        }
                        break;
                    case 20:
-                               strncat (v, _(" / Exposure mode : "), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _(" / Exposure mode : "), maxlen - strlen(val));
                                switch (vs) {
-                               case 0:
-                                       strncat (v, _("Easy shooting"), sizeof (v) - 1 - strlen(v));
-                                       break;
-                               case 1:
-                                       strncat (v, _("Program"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                       case 0:
+                                       strncat (val, _("Easy shooting"), maxlen - strlen(val));
+                    break;
+                case 1:
+                                       strncat (val, _("Program"), maxlen - strlen(val));
+                                       break;
                                case 2:
-                                       strncat (v, _("Tv-priority"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Tv-priority"), maxlen - strlen(val));
+                                       break;
                                case 3:
-                                       strncat (v, _("Av-priority"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Av-priority"), maxlen - strlen(val));
+                                       break;
                                case 4:
-                                       strncat (v, _("Manual"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Manual"), maxlen - strlen(val));
+                                       break;
                                case 5:
-                                       strncat (v, _("A-DEP"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("A-DEP"), maxlen - strlen(val));
+                                       break;
                                default:
-                                       snprintf (buf, sizeof (buf), "%i???", vs);
-                                       strncat (v,buf, sizeof (v) - 1 - strlen(v));
-                               }
+                                       snprintf (buf, sizeof (buf), _("%i???"), vs);
+                                       strncat (val, buf, maxlen - strlen(val));
+                }
                                break;
                        case 23:
-                               snprintf (buf, sizeof (buf), " / %s : %u", _("long focal length of lens (in focal units)"), vs);
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               snprintf (buf, sizeof (buf), _(" / long focal length of lens (in focal units) : %u"), vs);
+                               strncat (val, buf, maxlen - strlen(val));
                                break;
                        case 24:
-                               snprintf (buf, sizeof (buf), " / %s : %u", _("short focal length of lens (in focal units)"), vs);
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               snprintf (buf, sizeof (buf), _(" / short focal length of lens (in focal units) : %u"), vs);
+                               strncat (val, buf, maxlen - strlen(val));
                                break;
                        case 25:
-                               snprintf (buf, sizeof (buf), " / %s : %u", _("focal units per mm"), vs);
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               snprintf (buf, sizeof (buf), _(" / focal units per mm : %u"), vs);
+                               strncat (val, buf, maxlen - strlen(val));
                                break;
                        case 29:
-                               strncat (v, _(" / Flash details : "), sizeof (v) - 1 - strlen(v));
+                               strncat (val, _(" / Flash details : "), maxlen - strlen(val));
                                if ((vs>>14)&1)
-                                       strncat (v, _("External E-TTL"), sizeof (v) - 1 - strlen(v));
-                               if ((vs>>13)&1)
-                                       strncat (v, _("Internal flash"), sizeof (v) - 1 - strlen(v));
+                                       strncat (val, _("External E-TTL"), maxlen - strlen(val));
+                               if ((vs>>13)&1)
+                                       strncat (val, _("Internal flash"), maxlen - strlen(val));
                                if ((vs>>11)&1)
-                                       strncat (v, _("FP sync used"), sizeof (v) - 1 - strlen(v));
+                                       strncat (val, _("FP sync used"), maxlen - strlen(val));
                                if ((vs>>4)&1)
-                                       strncat (v, _("FP sync enabled"), sizeof (v) - 1 - strlen(v));
+                                       strncat (val, _("FP sync enabled"), maxlen - strlen(val));
 #ifdef DEBUG
-                               printf ("Value29=0x%08x\n", vs);
+                               printf ("Value29=0x%08x\n", vs);
 #endif
                                break;
                        case 32:
-                               snprintf (buf, sizeof (buf), " / %s : ", _("Focus mode2"));
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               strncat (val, _(" / Focus mode2 : "), maxlen - strlen(val));
                                switch (vs) {
-                               case 0:
-                                       strncat (v, _("Single"), sizeof (v) - 1 - strlen(v));
-                                       break;
-                               case 1:
-                                       strncat (v, _("Continuous"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                               case 0:
+                                       strncat (val, _("Single"), maxlen - strlen(val));
+                                       break;
+                               case 1:
+                                       strncat (val, _("Continuous"), maxlen - strlen(val));
+                                       break;
                                default:
-                                       snprintf (buf, sizeof (buf), "%i???", vs);
-                                       strncat (v,buf, sizeof (v) - 1 - strlen(v));
-                               }
+                                       snprintf (buf, sizeof (buf), _("%i???"), vs);
+                                       strncat (val, buf, maxlen - strlen(val));
+                               }
                                break;
 #ifdef DEBUG
                        default:
@@ -439,10 +440,10 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
                 break;
 
        case MNOTE_CANON_TAG_SETTINGS_2:
-               CF (entry->format, EXIF_FORMAT_SHORT, v);
+               CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen);
                n = exif_get_short (data, entry->order)/2;
                data += 2;
-               CC (entry->components, n, v);
+               CC (entry->components, n, val, maxlen);
 #ifdef DEBUG
                printf ("Setting2 size %d %d\n",n,entry->size);
 #endif
@@ -452,68 +453,67 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
                        data+=2;
                        switch(i) {
                        case 7:
-                               strncpy (v, _("White balance : "), sizeof (v) - 1 - strlen(v));
+                               strncpy (val, _("White balance : "), maxlen - strlen(val));
                                switch (vs) {
-                               case 0:
-                                       strncat (v, _("Auto"), sizeof (v) - 1 - strlen(v));
-                                       break;
-                               case 1:
-                                       strncat (v, _("Sunny"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                               case 0:
+                                       strncat (val, _("Auto"), maxlen - strlen(val));
+                                       break;
+                               case 1:
+                                       strncat (val, _("Sunny"), maxlen - strlen(val));
+                                       break;
                                case 2:
-                                       strncat (v, _("Cloudy"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Cloudy"), maxlen - strlen(val));
+                                       break;
                                case 3:
-                                       strncat (v, _("Tungsten"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Tungsten"), maxlen - strlen(val));
+                                       break;
                                case 4:
-                                       strncat (v, _("Flourescent"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Flourescent"), maxlen - strlen(val));
+                                       break;
                                case 5:
-                                       strncat (v, _("Flash"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Flash"), maxlen - strlen(val));
+                                       break;
                                case 6:
-                                       strncat (v, _("Custom"), sizeof (v) - 1 - strlen(v));
-                                       break;
+                                       strncat (val, _("Custom"), maxlen - strlen(val));
+                                       break;
                                default:
-                                       snprintf (buf, sizeof (buf), "%i???", vs);
-                                       strncat (v,buf, sizeof (v) - 1 - strlen(v));
-                               }
+                                       snprintf (buf, sizeof (buf), _("%i???"), vs);
+                                       strncat (val, buf, maxlen - strlen(val));
+                               }
                                break;
                        case 9:
-                               snprintf (buf, sizeof (buf), " / %s : %u", _("Sequence number"), vs);
-                               strncat (v, buf, sizeof (v) - 1 - strlen(v));
-
+                               snprintf (buf, sizeof (buf), _(" / Sequence number : %u"), vs);
+                               strncat (val, buf, maxlen - strlen(val));
                                break;
                        case 14:
                                if (vs>>12)
                                {
-                                       strncat (v, _(" / AF point used : "), sizeof (v) - 1 - strlen(v));
+                                       strncat (val, _(" / AF point used : "), maxlen - strlen(val));
                                        if (vs&1)
-                                               strncat (v, _("Right"), sizeof (v) - 1 - strlen(v));
-                                       if ((vs>>1)&1)
-                                               strncat (v, _("Center"), sizeof (v) - 1 - strlen(v));
+                                               strncat (val, _("Right"), maxlen - strlen(val));
+                                       if ((vs>>1)&1)
+                                               strncat (val, _("Center"), maxlen - strlen(val));
                                        if ((vs>>2)&1)
-                                               strncat (v, _("Left"), sizeof (v) - 1 - strlen(v));
-                                       snprintf (buf, sizeof (buf), " (%u %s)", vs>>12, _("available focus point"));
-                                       strncat (v, buf, sizeof (v) - 1 - strlen(v));
+                                               strncat (val, _("Left"), maxlen - strlen(val));
+                                       snprintf (buf, sizeof (buf), _(" (%u available focus point)"), vs>>12);
+                                       strncat (val, buf, maxlen - strlen(val));
                                }
 #ifdef DEBUG
-                               printf ("0x%08x\n", vs);
+                                       printf ("0x%08x\n", vs);
 #endif
                                break;
                        case 15:
-                               snprintf (buf, sizeof (buf), " / %s : %.2f EV", _("Flash bias"), vs/32.0);
-                               strncat (v, buf, sizeof (v) - 1 - strlen(v));
+                               snprintf (buf, sizeof (buf), _(" / Flash bias : %.2f EV"), vs/32.0);
+                               strncat (val, buf, maxlen - strlen(val));
 
                                break;
                        case 19:
-                               snprintf (buf, sizeof (buf), " / %s : %u", _("Subject Distance (mm)"), vs);
-                               strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                               snprintf (buf, sizeof (buf), _(" / Subject Distance (mm) : %u"), vs);
+                               strncat (val, buf, maxlen - strlen(val));
                                break;
 #ifdef DEBUG
-                        default:
-                               printf ("Value%d=%d\n", i, vs);
+                       default:
+                               printf ("Value%d=%d\n", i, vs);
 #endif
                        }
                }
@@ -522,36 +522,36 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
 
        case MNOTE_CANON_TAG_IMAGE_TYPE:
        case MNOTE_CANON_TAG_OWNER:
-               CF (entry->format, EXIF_FORMAT_ASCII, v);
-               CC (entry->components, 32, v);
-               strncpy (v,data,MIN (entry->size, sizeof (v) - 1));
+               CF (entry->format, EXIF_FORMAT_ASCII, val, maxlen);
+               CC (entry->components, 32, val, maxlen);
+               strncpy (val, data, MIN (entry->size, maxlen));
                break;
 
        case MNOTE_CANON_TAG_FIRMWARE:
-               CF (entry->format, EXIF_FORMAT_ASCII, v);
-               CC2 (entry->components, 24, 32, v);
-               strncpy (v,data,MIN (entry->size, sizeof (v) - 1));
+               CF (entry->format, EXIF_FORMAT_ASCII, val, maxlen);
+               CC2 (entry->components, 24, 32, val, maxlen);
+               strncpy (val, data, MIN (entry->size, maxlen));
                break;
 
        case MNOTE_CANON_TAG_IMAGE_NUMBER:
-               CF (entry->format, EXIF_FORMAT_LONG, v);
-               CC (entry->components, 1, v);
+               CF (entry->format, EXIF_FORMAT_LONG, val, maxlen);
+               CC (entry->components, 1, val, maxlen);
                vl = exif_get_long (data, entry->order);
-               snprintf (v, sizeof (v), "%03lu-%04lu", vl/10000,vl%10000);
+               snprintf (val, maxlen, "%03lu-%04lu", vl/10000,vl%10000);
                break;
 
        case MNOTE_CANON_TAG_SERIAL_NUMBER:
-               CF (entry->format, EXIF_FORMAT_LONG, v);
-               CC (entry->components, 1, v);
+               CF (entry->format, EXIF_FORMAT_LONG, val, maxlen);
+               CC (entry->components, 1, val, maxlen);
                vl = exif_get_long (data, entry->order);
-               snprintf (v, sizeof (v), "%04X-%05d", (int)vl>>16,(int)vl&0xffff);
+               snprintf (val, maxlen, "%04X-%05d", (int)vl>>16,(int)vl&0xffff);
                break;
 
        case MNOTE_CANON_TAG_CUSTOM_FUNCS:
-               CF (entry->format, EXIF_FORMAT_SHORT, v);
+               CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen);
                n = exif_get_short (data, entry->order)/2;
                data+=2;
-               CC (entry->components, n, v);
+               CC (entry->components, n, val, maxlen);
 #ifdef DEBUG
                printf ("Custom Function size %d %d\n",n,entry->size);
 #endif
@@ -559,8 +559,8 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
                {
                        vs = exif_get_short (data, entry->order);
                        data += 2;
-                       snprintf (buf, sizeof(buf), "C.F%d : %u", i, vs);
-                       strncat (v,buf, sizeof (v) - 1 - strlen(v));
+                       snprintf (buf, sizeof(buf), _("C.F%d : %u"), i, vs);
+                       strncat (val, buf, maxlen - strlen(val));
                }
                break;
 
@@ -579,10 +579,10 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
                        printf ("Value%d=%d\n", i, vs);
                }
                else if (entry->format == EXIF_FORMAT_ASCII)
-                   strncpy (v,data,MIN (entry->size, sizeof (v) - 1));
+                   strncpy (val, data, MIN (entry->size, maxlen));
 #endif
                break;
         }
 
-        return strdup (v);
+        return val;
 }
index cfd94c6..62345d8 100644 (file)
@@ -38,6 +38,6 @@ struct _MnoteCanonEntry {
        ExifByteOrder order;
 };
 
-char *mnote_canon_entry_get_value (const MnoteCanonEntry *entry);
+char *mnote_canon_entry_get_value (const MnoteCanonEntry *entry, char *val, unsigned int maxlen);
 
 #endif /* __MNOTE_CANON_ENTRY_H__ */