From: Lutz M?l. <lu...@us...> - 2003-10-27 20:10:13
|
Update of /cvsroot/libexif/libexif/libexif/canon In directory sc8-pr-cvs1:/tmp/cvs-serv6680/libexif/canon Modified Files: exif-mnote-data-canon.c mnote-canon-entry.c Log Message: 2003-10-27 Lutz Mueller <lu...@us...> * libexif: The code now compiles and loads the canon maker note, but crashes if you query its contents. Index: mnote-canon-entry.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/mnote-canon-entry.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mnote-canon-entry.c 26 Oct 2003 10:06:17 -0000 1.1 +++ mnote-canon-entry.c 27 Oct 2003 20:07:11 -0000 1.2 @@ -32,41 +32,6 @@ /* #define DEBUG */ -#if 0 -void -mnote_canon_entry_dump (MnoteEntry *e, unsigned int indent) -{ - MnoteCanonEntry *entry = (MnoteCanonEntry *)e; - - char buf[1024]; - unsigned int i; - - for (i = 0; i < 2 * indent; i++) - buf[i] = ' '; - buf[i] = '\0'; - - if (!e) - return; -#ifndef DEBUG - if (mnote_canon_tag_get_name (entry->tag)!=NULL) - { -#endif - printf ("%sTag: 0x%x ('%s')\n", buf, entry->tag, - mnote_canon_tag_get_name (entry->tag)); -#ifdef DEBUG - printf ("%s Format: %i ('%s')\n", buf, entry->format, - exif_format_get_name (entry->format)); - printf ("%s Components: %i\n", buf, (int) entry->components); - printf ("%s Size: %i\n", buf, entry->size); -#endif - printf ("%s Value: %s\n", buf, mnote_canon_entry_get_value (entry)); -#ifndef DEBUG - } -#endif -} - -#endif - #define CF(format,target,v) \ { \ if (format != target) { \ @@ -94,306 +59,297 @@ { char v[1024], buf[1024]; ExifLong vl; - ExifShort vs,n; + ExifShort vs, n; int i; unsigned char *data = entry->data; - if (!entry) - return (NULL); + if (!entry) return NULL; memset (v, 0, sizeof (v)); -#ifdef DEBUG - printf ("Processing Tag %x\n",entry->tag); -#endif switch (entry->tag) { case MNOTE_CANON_TAG_SETTINGS_1: CF (entry->format, EXIF_FORMAT_SHORT, v); n = exif_get_short (data, entry->order)/2; data+=2; CC (entry->components, n, v); -#ifdef DEBUG - printf ("Setting1 size %d %d\n",n,entry->size); -#endif - for (i=1;i<n;i++) - { - vs = exif_get_short (data, entry->order); - data+=2; - switch(i) { + 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); + switch (vs) { case 1: - strncpy (v, _("Macro mode : "), sizeof (v) - 1); - switch (vs) { - case 1: - strncat (v, _("Macro"), sizeof (v) - 1 - strlen(v)); - break; - case 2: - strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; + strncat (v, _("Macro"), sizeof (v) - 1 - strlen(v)); + break; case 2: - if (vs) - { - snprintf (buf, sizeof (buf), _(" / Self Timer : %i (ms)"), vs*100); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 2: + if (vs) { + snprintf (buf, sizeof (buf), + _(" / Self Timer : %i (ms)"), vs*100); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 4: + strncat (v,_(" / Flash mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Flash not fired"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("auto"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("on"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("red eyes reduction"), sizeof (v) - 1 - strlen(v)); + break; case 4: - strncat (v,_(" / Flash mode : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0: - strncat (v, _("Flash not fired"), sizeof (v) - 1 - strlen(v)); - break; - case 1: - strncat (v, _("auto"), sizeof (v) - 1 - strlen(v)); - break; - case 2: - strncat (v, _("on"), sizeof (v) - 1 - strlen(v)); - break; - case 3: - strncat (v, _("red eyes reduction"), sizeof (v) - 1 - strlen(v)); - break; - case 4: - strncat (v, _("slow synchro"), sizeof (v) - 1 - strlen(v)); - break; - case 5: - strncat (v, _("auto + red eyes reduction"), sizeof (v) - 1 - strlen(v)); - break; - case 6: - strncat (v, _("on + red eyes reduction"), sizeof (v) - 1 - strlen(v)); - break; - case 16: - strncat (v, _("external"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; + strncat (v, _("slow synchro"), sizeof (v) - 1 - strlen(v)); + break; case 5: - strncat (v, _(" / Continuous drive mode : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0: - strncat (v, _("single or timer"), sizeof (v) - 1 - strlen(v)); - break; - case 1: - strncat (v, _("continuous"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v, buf, sizeof (v) - 1 - strlen(v)); - } - break; + strncat (v, _("auto + red eyes reduction"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("on + red eyes reduction"), sizeof (v) - 1 - strlen(v)); + break; + case 16: + strncat (v, _("external"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 5: + strncat (v, _(" / Continuous drive mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("single or timer"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("continuous"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v, buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 7: + strncat (v, _(" / Focus mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("One-Shot"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("AI Servo"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("AI Focus"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("MF"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Single"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Continuous"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("MF"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 10: + strncat (v, _(" / Image size : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Large"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Medium"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Small"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 11: + strncat (v, _(" / Easy shooting mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0: + strncat (v, _("Full Auto"), sizeof (v) - 1 - strlen(v)); + break; + case 1: + strncat (v, _("Manual"), sizeof (v) - 1 - strlen(v)); + break; + case 2: + strncat (v, _("Landscape"), sizeof (v) - 1 - strlen(v)); + break; + case 3: + strncat (v, _("Fast Shutter"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Slow Shutter"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Night"), sizeof (v) - 1 - strlen(v)); + break; + case 6: + strncat (v, _("Black & White"), sizeof (v) - 1 - strlen(v)); + break; case 7: - strncat (v, _(" / Focus mode : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0: - strncat (v, _("One-Shot"), sizeof (v) - 1 - strlen(v)); - break; - case 1: - strncat (v, _("AI Servo"), sizeof (v) - 1 - strlen(v)); - break; - case 2: - strncat (v, _("AI Focus"), sizeof (v) - 1 - strlen(v)); - break; - case 3: - strncat (v, _("MF"), sizeof (v) - 1 - strlen(v)); - break; - case 4: - strncat (v, _("Single"), sizeof (v) - 1 - strlen(v)); - break; - case 5: - strncat (v, _("Continuous"), sizeof (v) - 1 - strlen(v)); - break; - case 6: - strncat (v, _("MF"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; + strncat (v, _("Sepia"), sizeof (v) - 1 - strlen(v)); + break; + case 8: + strncat (v, _("Portrait"), sizeof (v) - 1 - strlen(v)); + break; + case 9: + strncat (v, _("Sports"), sizeof (v) - 1 - strlen(v)); + break; case 10: - strncat (v, _(" / Image size : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0: - strncat (v, _("Large"), sizeof (v) - 1 - strlen(v)); - break; - case 1: - strncat (v, _("Medium"), sizeof (v) - 1 - strlen(v)); - break; - case 2: - strncat (v, _("Small"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; + strncat (v, _("Macro / Close-Up"), sizeof (v) - 1 - strlen(v)); + break; case 11: - strncat (v, _(" / Easy shooting mode : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0: - strncat (v, _("Full Auto"), sizeof (v) - 1 - strlen(v)); - break; - case 1: - strncat (v, _("Manual"), sizeof (v) - 1 - strlen(v)); - break; - case 2: - strncat (v, _("Landscape"), sizeof (v) - 1 - strlen(v)); - break; - case 3: - strncat (v, _("Fast Shutter"), sizeof (v) - 1 - strlen(v)); - break; - case 4: - strncat (v, _("Slow Shutter"), sizeof (v) - 1 - strlen(v)); - break; - case 5: - strncat (v, _("Night"), sizeof (v) - 1 - strlen(v)); - break; - case 6: - strncat (v, _("Black & White"), sizeof (v) - 1 - strlen(v)); - break; - case 7: - strncat (v, _("Sepia"), sizeof (v) - 1 - strlen(v)); - break; - case 8: - strncat (v, _("Portrait"), sizeof (v) - 1 - strlen(v)); - break; - case 9: - strncat (v, _("Sports"), sizeof (v) - 1 - strlen(v)); - break; - case 10: - strncat (v, _("Macro / Close-Up"), sizeof (v) - 1 - strlen(v)); - break; - case 11: - strncat (v, _("Pan Focus"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; - case 13: - strncat (v, _(" / Contrast : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0xffff: - strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); - break; - case 0x0000: - strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); - break; - case 0x0001: - strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } + strncat (v, _("Pan Focus"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 13: + strncat (v, _(" / Contrast : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0xffff: + strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0000: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0001: + strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 14: + strncat (v, _(" / Saturation : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0xffff: + strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0000: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0001: + strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 15: + strncat (v, _(" / Sharpness : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0xffff: + strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0000: + strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); + break; + case 0x0001: + strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 16: + if (vs) { + strncat (v, _(" / ISO : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 15: + strncat (v, _("auto"), sizeof (v) - 1 - strlen(v)); break; - case 14: - strncat (v, _(" / Saturation : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0xffff: - strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); - break; - case 0x0000: - strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); - break; - case 0x0001: - strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } + case 16: + strncat (v, _("50"), sizeof (v) - 1 - strlen(v)); break; - case 15: - strncat (v, _(" / Sharpness : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0xffff: - strncat (v, _("Low"), sizeof (v) - 1 - strlen(v)); - break; - case 0x0000: - strncat (v, _("Normal"), sizeof (v) - 1 - strlen(v)); - break; - case 0x0001: - strncat (v, _("High"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } + case 17: + strncat (v, _("100"), sizeof (v) - 1 - strlen(v)); break; - case 16: - if (vs) - { - strncat (v, _(" / ISO : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 15: - strncat (v, _("auto"), sizeof (v) - 1 - strlen(v)); - break; - case 16: - strncat (v, _("50"), sizeof (v) - 1 - strlen(v)); - break; - case 17: - strncat (v, _("100"), sizeof (v) - 1 - strlen(v)); - break; - case 18: - strncat (v, _("200"), sizeof (v) - 1 - strlen(v)); - break; - case 19: - strncat (v, _("400"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } - break; - } - case 17: - strncat (v, _(" / Metering mode : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 3: - strncat (v, _("Evaluative"), sizeof (v) - 1 - strlen(v)); - break; - case 4: - strncat (v, _("Partial"), sizeof (v) - 1 - strlen(v)); - break; - case 5: - strncat (v, _("Center-weighted"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "%i???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } + case 18: + strncat (v, _("200"), sizeof (v) - 1 - strlen(v)); break; - case 19: - strncat (v, _(" / AF point selected : "), sizeof (v) - 1 - strlen(v)); - switch (vs) { - case 0x3000: - strncat (v, _("none (MF)"), sizeof (v) - 1 - strlen(v)); - break; - case 0x3001: - strncat (v, _("auto-selected"), sizeof (v) - 1 - strlen(v)); - break; - case 0x3002: - strncat (v, _("right"), sizeof (v) - 1 - strlen(v)); - break; - case 0x3003: - strncat (v, _("center"), sizeof (v) - 1 - strlen(v)); - break; - case 0x3004: - strncat (v, _("left"), sizeof (v) - 1 - strlen(v)); - break; - default: - snprintf (buf, sizeof (buf), "0x%x???", vs); - strncat (v,buf, sizeof (v) - 1 - strlen(v)); - } + case 19: + strncat (v, _("400"), sizeof (v) - 1 - strlen(v)); break; - case 20: + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + } + case 17: + strncat (v, _(" / Metering mode : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 3: + strncat (v, _("Evaluative"), sizeof (v) - 1 - strlen(v)); + break; + case 4: + strncat (v, _("Partial"), sizeof (v) - 1 - strlen(v)); + break; + case 5: + strncat (v, _("Center-weighted"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "%i???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 19: + strncat (v, _(" / AF point selected : "), sizeof (v) - 1 - strlen(v)); + switch (vs) { + case 0x3000: + strncat (v, _("none (MF)"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3001: + strncat (v, _("auto-selected"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3002: + strncat (v, _("right"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3003: + strncat (v, _("center"), sizeof (v) - 1 - strlen(v)); + break; + case 0x3004: + strncat (v, _("left"), sizeof (v) - 1 - strlen(v)); + break; + default: + snprintf (buf, sizeof (buf), "0x%x???", vs); + strncat (v,buf, sizeof (v) - 1 - strlen(v)); + } + break; + case 20: strncat (v, _(" / Exposure mode : "), sizeof (v) - 1 - strlen(v)); switch (vs) { case 0: @@ -552,6 +508,7 @@ break; 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,sizeof (v)); @@ -568,12 +525,6 @@ CC (entry->components, 1, v); vl = exif_get_long (data, entry->order); snprintf (v, sizeof (v), "%03lu-%04lu", vl/10000,vl%10000); - break; - - case MNOTE_CANON_TAG_OWNER: - CF (entry->format, EXIF_FORMAT_ASCII, v); - CC (entry->components, 32, v); - strncpy (v,data,sizeof (v)); break; case MNOTE_CANON_TAG_SERIAL_NUMBER: Index: exif-mnote-data-canon.c =================================================================== RCS file: /cvsroot/libexif/libexif/libexif/canon/exif-mnote-data-canon.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- exif-mnote-data-canon.c 26 Oct 2003 22:30:26 -0000 1.2 +++ exif-mnote-data-canon.c 27 Oct 2003 20:07:11 -0000 1.3 @@ -33,23 +33,30 @@ #define DEBUG static void -exif_mnote_data_canon_free (ExifMnoteData *n) +exif_mnote_data_canon_clear (ExifMnoteDataCanon *n) { - ExifMnoteDataCanon *note = (ExifMnoteDataCanon *) n; - unsigned int i; + unsigned int i; if (!n) return; - if (note->entries) { - for (i = 0; i < note->count; i++) - if (note->entries[i].data) { - free (note->entries[i].data); - note->entries[i].data = NULL; + if (n->entries) { + for (i = 0; i < n->count; i++) + if (n->entries[i].data) { + free (n->entries[i].data); + n->entries[i].data = NULL; } - free (note->entries); - note->entries = NULL; - note->count = 0; - } + free (n->entries); + n->entries = NULL; + n->count = 0; + } +} + +static void +exif_mnote_data_canon_free (ExifMnoteData *n) +{ + if (!n) return; + + exif_mnote_data_canon_clear ((ExifMnoteDataCanon *) n); } static char * @@ -63,9 +70,73 @@ } static void -exif_mnote_data_canon_set_byte_order (ExifMnoteData *n, ExifByteOrder o) +exif_mnote_data_canon_set_byte_order (ExifMnoteData *d, ExifByteOrder o) { - if (n) ((ExifMnoteDataCanon *) n)->order = o; + ExifByteOrder o_orig; + ExifMnoteDataCanon *n = (ExifMnoteDataCanon *) d; + unsigned int i, fs; + ExifShort s; + ExifLong l; + ExifSLong sl; + ExifRational r; + ExifSRational sr; + + if (!n) return; + + o_orig = n->order; + n->order = o; + for (i = 0; i < n->count; i++) { + n->entries[i].order = o; + fs = exif_format_get_size (n->entries[i].format); + switch (n->entries[i].format) { + case EXIF_FORMAT_SHORT: + for (i = 0; i < n->entries[i].components; i++) { + s = exif_get_short (n->entries[i].data + (i*fs), + o_orig); + exif_set_short (n->entries[i].data + (i * fs), + o, s); + } + break; + case EXIF_FORMAT_LONG: + for (i = 0; i < n->entries[i].components; i++) { + l = exif_get_long (n->entries[i].data + (i*fs), + o_orig); + exif_set_long (n->entries[i].data + (i * fs), + o, l); + } + break; + case EXIF_FORMAT_RATIONAL: + for (i = 0; i < n->entries[i].components; i++) { + r = exif_get_rational (n->entries[i].data + + (i * fs), o_orig); + exif_set_rational (n->entries[i].data + + (i * fs), o, r); + } + break; + case EXIF_FORMAT_SLONG: + for (i = 0; i < n->entries[i].components; i++) { + sl = exif_get_slong (n->entries[i].data + + (i * fs), o_orig); + exif_set_slong (n->entries[i].data + + (i * fs), o, sl); + } + break; + case EXIF_FORMAT_SRATIONAL: + for (i = 0; i < n->entries[i].components; i++) { + sr = exif_get_srational (n->entries[i].data + + (i * fs), o_orig); + exif_set_srational (n->entries[i].data + + (i * fs), o, sr); + } + break; + case EXIF_FORMAT_UNDEFINED: + case EXIF_FORMAT_BYTE: + case EXIF_FORMAT_ASCII: + default: + /* Nothing here. */ + break; + } + } } static void @@ -75,105 +146,53 @@ } static void -exif_mnote_data_canon_load_entry_with_exif (ExifMnoteDataCanon *note, - MnoteCanonEntry *entry, - const unsigned char *d, - unsigned int size, unsigned int offset, - const unsigned char *exifdata, - unsigned int exifsize) -{ - unsigned int s, doff, sizetmp = size; - const unsigned char *temp = d; - - entry->tag = exif_get_short (d + offset + 0, note->order); - entry->format = exif_get_short (d + offset + 2, note->order); - entry->components = exif_get_long (d + offset + 4, note->order); - - /* - * Size? If bigger than 4 bytes, the actual data is not - * in the entry but somewhere else (offset). - */ - s = exif_format_get_size (entry->format) * entry->components; - if (!s) - return; - if (s > 4) - { - doff = exif_get_long (d + offset + 8, note->order) + 0xC; - sizetmp = exifsize; - temp = exifdata; - } - else - doff = offset + 8; - -#ifdef DEBUG - printf ("Comp %x %d %d %x %x\n",doff, s, sizetmp,temp[doff],temp[doff+1]); -#endif - /* Sanity check */ - if (sizetmp < doff + s) - return; - entry->data = malloc (sizeof (char) * s); - if (!entry->data) - return; - entry->size = s; - memcpy (entry->data, temp + doff, s); - entry->order = note->order; -} - -static void exif_mnote_data_canon_load (ExifMnoteData *ne, const unsigned char *buf, unsigned int buf_size) { - ExifMnoteDataCanon *data = (ExifMnoteDataCanon *) ne; - const unsigned char *d = buf; - ExifShort n; - unsigned int i; - unsigned int size = buf_size; - MnoteCanonTag tag; - - if (!data) - return; - if (!buf || !buf_size) - return; + ExifMnoteDataCanon *n = (ExifMnoteDataCanon *) ne; + ExifShort c; + unsigned int i, o, s; -#ifdef DEBUG - printf ("Parsing %i byte(s) data at offset %i...\n", size, - data->offset); -#endif -#if 0 - int j; - for (j=0;j<size;j++) - { - if (!(j%16)) printf("\n"); - printf("%02X ",d[j]);} + if (!n || !buf || !buf_size || (buf_size < 6 + n->offset + 2)) return; - printf("\n%d\n",size); - printf("%d\n",data->order); -#endif + /* Read the number of entries and remove old ones. */ + c = exif_get_short (buf + 6 + n->offset, n->order); + exif_mnote_data_canon_clear (n); - /* Read the number of entries */ - n = exif_get_short (buf + 6 + data->offset, data->order); -#ifdef DEBUG - printf ("Loading %i entries...\n", n); -#endif - d += 2; - size -= 2; + /* Parse the entries */ + for (i = 0; i < c; i++) { + o = 6 + 2 + n->offset + 12 * i; + if (o + 8 > buf_size) return; - if (12 * n > size) return; + n->count = i + 1; + n->entries = realloc (n->entries, sizeof (MnoteCanonEntry) * (i+1)); + memset (&n->entries[i], 0, sizeof (MnoteCanonEntry)); + n->entries[i].tag = exif_get_short (buf + o, n->order); + n->entries[i].format = exif_get_short (buf + o + 2, n->order); + n->entries[i].components = exif_get_long (buf + o + 4, n->order); + n->entries[i].order = n->order; - for (i = 0; i < n; i++) { + /* + * Size? If bigger than 4 bytes, the actual data is not + * in the entry but somewhere else (offset). + */ + s = exif_format_get_size (n->entries[i].format) * + n->entries[i].components; + if (!s) return; + o += 8; + if (s > 4) o = exif_get_long (buf + o, n->order) + 6; + if (o + s > buf_size) return; + + /* Sanity check */ + n->entries[i].data = malloc (sizeof (char) * s); + if (!n->entries[i].data) return; + n->entries[i].size = s; + memcpy (n->entries[i].data, buf + o, s); + } - tag = exif_get_short (d + 12 * i, data->order); #ifdef DEBUG - printf ("Loading entry '%s' (%i of %i)...\n", - mnote_canon_tag_get_name (tag), i + 1, n); + printf ("Loaded %i entries.\n", n->count); #endif - data->count++; - data->entries = realloc (data->entries, - sizeof (MnoteCanonEntry) * data->count); - exif_mnote_data_canon_load_entry_with_exif (data, - &data->entries[data->count - 1], - d, size, 12 * i, buf, buf_size); - } } static unsigned int |