void agfa1_offset_makervalue(FILE *inptr,unsigned short byteorder, struct ifd_entry *entry_ptr,unsigned long fileoffset_base, struct image_summary *summary_entry,char *parent_name,char*prefix, int indent,int make,int model,int at_offset) { unsigned long max_offset = 0; unsigned long value_offset; unsigned long dumplength,count; unsigned short marker; char *nameoftag; char *fulldirname = NULL; int status = 0; int chpr = 0; if(entry_ptr) { nameoftag = maker_tagname(entry_ptr->tag,make,model); fulldirname = splice(parent_name,".",nameoftag); value_offset = fileoffset_base + entry_ptr->value; count = entry_ptr->count; switch(entry_ptr->tag) { case 0x0209: /* CameraId */ if(at_offset && (PRINT_VALUE_AT_OFFSET)) { print_tag_address(ENTRY,value_offset,indent,prefix); print_makertagid(entry_ptr,23," = ",make,model); } if((PRINT_VALUE)) print_ascii(inptr,entry_ptr->count,value_offset); break; case 0x0100: /* Jpeg Thumbnail */ if(at_offset && (PRINT_SECTION)) { print_tag_address(VALUE_AT_OFFSET,value_offset,indent,prefix); chpr += printf("# Start of JPEG Thumbnail from MakerNote"); chpr += printf(" length %ld",count); } else if(!at_offset && (PRINT_VALUE)) { if(!(PRINT_OFFSET)) chpr += printf("@%lu",value_offset); else chpr = printf("length %lu",count); } if((PRINT_SECTION) || (PRINT_SEGMENT)) chpr = newline(chpr); marker = read_ushort(inptr,TIFF_MOTOROLA,value_offset); max_offset = process_jpeg_segments(inptr,value_offset,marker, count,summary_entry,fulldirname, prefix,indent+SMALLINDENT); if(at_offset) { if((PRINT_SECTION)) { if((status = jpeg_status(0) == JPEG_EARLY_EOI)) chpr = newline(chpr); jpeg_status(status); print_tag_address(VALUE_AT_OFFSET,value_offset + count - 1, indent,"-"); chpr += printf("# End of JPEG Thumbnail from MakerNote"); if((PRINT_ENTRY) && !(PRINT_VALUE)) chpr = newline(chpr); } } print_jpeg_status(); if(marker && summary_entry) { /* The new one is on the end of the chain */ if((summary_entry = last_summary_entry(summary_entry))) { summary_entry->filesubformat |= FILESUBFMT_MNOTE; summary_entry->datatype = MAKER_IFD; summary_entry->subfiletype = THUMBNAIL_TYPE; } } /* make certain we're at the end */ clearerr(inptr); fseek(inptr,value_offset + count,SEEK_SET); break; case 0x0f00: /* Data */ if(at_offset && (PRINT_ENTRY)) { print_tag_address(ENTRY,value_offset,indent,prefix); print_makertagid(entry_ptr,MAKERTAGWIDTH," : ",make,model); chpr += printf(" length %-9lu", count); if(Max_undefined == 0) { if(chpr) printred(" (not dumped, use -U)"); } else { if((Max_undefined == DUMPALL) || (Max_undefined > count)) dumplength = count; else dumplength = Max_undefined; chpr = newline(chpr); hexdump(inptr,value_offset,count,dumplength,12, indent,SUBINDENT); chpr = newline(1); } } else if(!at_offset && (PRINT_VALUE)) { if(!(PRINT_OFFSET)) chpr += printf("@%lu:%lu",value_offset,entry_ptr->count); else chpr = printf("length %lu", entry_ptr->count); if(!(PRINT_VALUE_AT_OFFSET)) chpr += printf(" # UNDEFINED"); } /* make certain we're at the end */ fseek(inptr,value_offset + count,SEEK_SET); break; default: print_generic_offset_makervalue(inptr,byteorder,entry_ptr, fileoffset_base,fulldirname,prefix,indent, make,model,at_offset); break; } if(fulldirname) free(fulldirname); } setcharsprinted(chpr); }
void print_generic_offset_makervalue(FILE *inptr,unsigned short byteorder, struct ifd_entry *entry_ptr,unsigned long fileoffset_base,char *parent_name, char *prefix,int indent,int make,int model,int at_offset) { unsigned long value_offset; unsigned long dumplength; int chpr = 0; if((value_type_size(entry_ptr->value_type) * entry_ptr->count) > 4) { value_offset = fileoffset_base + entry_ptr->value; if(PRINT_VALUE) { if(at_offset) { print_tag_address(ENTRY,value_offset,indent,prefix); if(entry_ptr->value_type == UNDEFINED) print_makertagid(entry_ptr,MAKERTAGWIDTH," : ",make,model); else print_makertagid(entry_ptr,MAKERTAGWIDTH," = ",make,model); } else { if((PRINT_OFFSET) && (entry_ptr->value_type != UNDEFINED)) chpr += printf(" = "); } switch(entry_ptr->value_type) { case UNDEFINED: /* Could make a pseudo-tag for 'count' in LIST */ /* mode... */ if((PRINT_SECTION) && at_offset && (PRINT_VALUE_AT_OFFSET)) chpr += printf("length %-9lu # UNDEFINED",entry_ptr->count); else { if(!(PRINT_OFFSET)) chpr += printf("@%lu",value_offset); chpr += printf(":%-9lu # UNDEFINED",entry_ptr->count); } if(Max_undefined == 0) { if((PRINT_SECTION)) printred(" (not dumped, use -U)"); } else { /* Even in LIST and REPORT modes */ if((Max_undefined == DUMPALL) || (Max_undefined > entry_ptr->count)) dumplength = entry_ptr->count; else dumplength = Max_undefined; chpr = newline(1); hexdump(inptr,entry_ptr->value + fileoffset_base, entry_ptr->count,dumplength,12, indent,SUBINDENT); } /* make certain we're at the end */ fseek(inptr,entry_ptr->value + fileoffset_base + entry_ptr->count,SEEK_SET); break; case ASCII: print_ascii(inptr,entry_ptr->count,value_offset); break; case BYTE: print_ubytes(inptr,entry_ptr->count,value_offset); break; case SBYTE: print_sbytes(inptr,entry_ptr->count,value_offset); break; case SHORT: print_ushort(inptr,entry_ptr->count,byteorder,value_offset); break; case SSHORT: print_sshort(inptr,entry_ptr->count,byteorder,value_offset); break; case LONG: print_ulong(inptr,entry_ptr->count,byteorder,value_offset); break; case SLONG: print_slong(inptr,entry_ptr->count,byteorder,value_offset); break; case RATIONAL: print_urational(inptr,entry_ptr->count,byteorder,value_offset); break; case SRATIONAL: print_srational(inptr,entry_ptr->count,byteorder,value_offset); break; case FLOAT: print_float(inptr,entry_ptr->count,byteorder,value_offset); break; case DOUBLE: print_double(inptr,entry_ptr->count,byteorder,value_offset); break; default: chpr = printf(" INVALID TYPE %#x",entry_ptr->value_type); break; } } } if(ferror(inptr) || feof(inptr)) clearerr(inptr); setcharsprinted(chpr); }