本文整理汇总了C++中TIFFSwabShort函数的典型用法代码示例。如果您正苦于以下问题:C++ TIFFSwabShort函数的具体用法?C++ TIFFSwabShort怎么用?C++ TIFFSwabShort使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了TIFFSwabShort函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ReadDirectory
/*
* Read the next TIFF directory from a file
* and convert it to the internal format.
* We read directories sequentially.
*/
static uint32
ReadDirectory(int fd, unsigned ix, uint32 off)
{
register TIFFDirEntry *dp;
register int n;
TIFFDirEntry *dir = 0;
uint16 dircount;
int space;
uint32 nextdiroff = 0;
if (off == 0) /* no more directories */
goto done;
if (lseek(fd, (off_t) off, 0) != off) {
Fatal("Seek error accessing TIFF directory");
goto done;
}
if (read(fd, (char*) &dircount, sizeof (uint16)) != sizeof (uint16)) {
ReadError("directory count");
goto done;
}
if (swabflag)
TIFFSwabShort(&dircount);
dir = (TIFFDirEntry *)_TIFFmalloc(dircount * sizeof (TIFFDirEntry));
if (dir == NULL) {
Fatal("No space for TIFF directory");
goto done;
}
n = read(fd, (char*) dir, dircount*sizeof (*dp));
if (n != dircount*sizeof (*dp)) {
n /= sizeof (*dp);
Error(
"Could only read %u of %u entries in directory at offset %#lx",
n, dircount, (unsigned long) off);
dircount = n;
}
if (read(fd, (char*) &nextdiroff, sizeof (uint32)) != sizeof (uint32))
nextdiroff = 0;
if (swabflag)
TIFFSwabLong(&nextdiroff);
printf("Directory %u: offset %lu (%#lx) next %lu (%#lx)\n", ix,
(unsigned long) off, (unsigned long) off,
(unsigned long) nextdiroff, (unsigned long) nextdiroff);
for (dp = dir, n = dircount; n > 0; n--, dp++) {
if (swabflag) {
TIFFSwabArrayOfShort(&dp->tdir_tag, 2);
TIFFSwabArrayOfLong(&dp->tdir_count, 2);
}
PrintTag(stdout, dp->tdir_tag);
putchar(' ');
PrintType(stdout, dp->tdir_type);
putchar(' ');
printf("%lu<", (unsigned long) dp->tdir_count);
if (dp->tdir_type >= NWIDTHS) {
printf(">\n");
continue;
}
space = dp->tdir_count * datawidth[dp->tdir_type];
if (space <= 4) {
switch (dp->tdir_type) {
case TIFF_FLOAT:
case TIFF_UNDEFINED:
case TIFF_ASCII: {
unsigned char data[4];
_TIFFmemcpy(data, &dp->tdir_offset, 4);
if (swabflag)
TIFFSwabLong((uint32*) data);
PrintData(stdout,
dp->tdir_type, dp->tdir_count, data);
break;
}
case TIFF_BYTE:
PrintByte(stdout, bytefmt, dp);
break;
case TIFF_SBYTE:
PrintByte(stdout, sbytefmt, dp);
break;
case TIFF_SHORT:
PrintShort(stdout, shortfmt, dp);
break;
case TIFF_SSHORT:
PrintShort(stdout, sshortfmt, dp);
break;
case TIFF_LONG:
PrintLong(stdout, longfmt, dp);
break;
case TIFF_SLONG:
PrintLong(stdout, slongfmt, dp);
break;
}
} else {
unsigned char *data = (unsigned char *)_TIFFmalloc(space);
if (data) {
if (TIFFFetchData(fd, dp, data))
if (dp->tdir_count > maxitems) {
PrintData(stdout, dp->tdir_type,
//.........这里部分代码省略.........
示例2: TIFFReadDirectory
/*
* Read the next TIFF directory from a file
* and convert it to the internal format.
* We read directories sequentially.
*/
int
TIFFReadDirectory(TIFF* tif)
{
register TIFFDirEntry* dp;
register int n;
register TIFFDirectory* td;
TIFFDirEntry* dir;
int iv;
long v;
double dv;
const TIFFFieldInfo* fip;
int fix;
uint16 dircount;
uint32 nextdiroff;
char* cp;
int diroutoforderwarning = 0;
tif->tif_diroff = tif->tif_nextdiroff;
if (tif->tif_diroff == 0) /* no more directories */
return (0);
/*
* Cleanup any previous compression state.
*/
(*tif->tif_cleanup)(tif);
tif->tif_curdir++;
nextdiroff = 0;
if (!isMapped(tif)) {
if (!SeekOK(tif, tif->tif_diroff)) {
TIFFError(tif->tif_name,
"Seek error accessing TIFF directory");
return (0);
}
if (!ReadOK(tif, &dircount, sizeof (uint16))) {
TIFFError(tif->tif_name,
"Can not read TIFF directory count");
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
dir = (TIFFDirEntry *)CheckMalloc(tif,
dircount * sizeof (TIFFDirEntry), "to read TIFF directory");
if (dir == NULL)
return (0);
if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) {
TIFFError(tif->tif_name, "Can not read TIFF directory");
goto bad;
}
/*
* Read offset to next directory for sequential scans.
*/
(void) ReadOK(tif, &nextdiroff, sizeof (uint32));
} else {
toff_t off = tif->tif_diroff;
if ((tsize_t) (off + sizeof (uint16)) > tif->tif_size) {
TIFFError(tif->tif_name,
"Can not read TIFF directory count");
return (0);
} else
_TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16));
off += sizeof (uint16);
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
dir = (TIFFDirEntry *)CheckMalloc(tif,
dircount * sizeof (TIFFDirEntry), "to read TIFF directory");
if (dir == NULL)
return (0);
if (((tsize_t) (off + dircount*sizeof (TIFFDirEntry)))
> tif->tif_size) {
TIFFError(tif->tif_name, "Can not read TIFF directory");
goto bad;
} else
_TIFFmemcpy(dir, tif->tif_base + off,
dircount*sizeof (TIFFDirEntry));
off += dircount* sizeof (TIFFDirEntry);
if (((tsize_t)(off + sizeof (uint32))) <= tif->tif_size)
_TIFFmemcpy(&nextdiroff, tif->tif_base+off, sizeof (uint32));
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabLong(&nextdiroff);
tif->tif_nextdiroff = nextdiroff;
tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
/*
* Setup default value and then make a pass over
* the fields to check type and tag information,
* and to extract info required to size data
* structures. A second pass is made afterwards
* to read in everthing not taken in the first pass.
*/
td = &tif->tif_dir;
/* free any old stuff and reinit */
TIFFFreeDirectory(tif);
TIFFDefaultDirectory(tif);
/*
//.........这里部分代码省略.........
示例3: TIFFLinkDirectory
/*
* Link the current directory into the
* directory chain for the file.
*/
static int
TIFFLinkDirectory(TIFF* tif)
{
static const char module[] = "TIFFLinkDirectory";
uint32 nextdir;
uint32 diroff;
tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1;
diroff = (uint32) tif->tif_diroff;
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabLong(&diroff);
#if SUBIFD_SUPPORT
if (tif->tif_flags & TIFF_INSUBIFD) {
(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
if (!WriteOK(tif, &diroff, sizeof (diroff))) {
TIFFError(module,
"%s: Error writing SubIFD directory link",
tif->tif_name);
return (0);
}
/*
* Advance to the next SubIFD or, if this is
* the last one configured, revert back to the
* normal directory linkage.
*/
if (--tif->tif_nsubifd)
tif->tif_subifdoff += sizeof (diroff);
else
tif->tif_flags &= ~TIFF_INSUBIFD;
return (1);
}
#endif
if (tif->tif_header.tiff_diroff == 0) {
/*
* First directory, overwrite offset in header.
*/
tif->tif_header.tiff_diroff = (uint32) tif->tif_diroff;
#define HDROFF(f) ((toff_t) &(((TIFFHeader*) 0)->f))
(void) TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET);
if (!WriteOK(tif, &diroff, sizeof (diroff))) {
TIFFError(tif->tif_name, "Error writing TIFF header");
return (0);
}
return (1);
}
/*
* Not the first directory, search to the last and append.
*/
nextdir = tif->tif_header.tiff_diroff;
do {
uint16 dircount;
if (!SeekOK(tif, nextdir) ||
!ReadOK(tif, &dircount, sizeof (dircount))) {
TIFFError(module, "Error fetching directory count");
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
(void) TIFFSeekFile(tif,
dircount * sizeof (TIFFDirEntry), SEEK_CUR);
if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
TIFFError(module, "Error fetching directory link");
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabLong(&nextdir);
} while (nextdir != 0);
(void) TIFFSeekFile(tif, -(toff_t) sizeof (nextdir), SEEK_CUR);
if (!WriteOK(tif, &diroff, sizeof (diroff))) {
TIFFError(module, "Error writing directory link");
return (0);
}
return (1);
}
示例4: TIFFClientOpen
//.........这里部分代码省略.........
((bigendian && mode[1] == 'l') || (!bigendian && mode[1] == 'b')))
tif->tif_flags |= TIFF_SWAB;
#endif
/*
* Read in TIFF header.
*/
if (!ReadOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
if (tif->tif_mode == O_RDONLY) {
TIFFError(name, "Cannot read TIFF header");
goto bad;
}
/*
* Setup header and write.
*/
tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB
? (bigendian ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN)
: (bigendian ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN);
tif->tif_header.tiff_version = TIFF_VERSION;
tif->tif_header.tiff_diroff = 0; /* filled in later */
if (!WriteOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
TIFFError(name, "Error writing TIFF header");
goto bad;
}
/*
* Setup the byte order handling.
*/
TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian);
/*
* Setup default directory.
*/
if (!TIFFDefaultDirectory(tif))
goto bad;
tif->tif_diroff = 0;
return (tif);
}
/*
* Setup the byte order handling.
*/
if (tif->tif_header.tiff_magic != TIFF_BIGENDIAN &&
tif->tif_header.tiff_magic != TIFF_LITTLEENDIAN) {
TIFFError(name, "Not a TIFF file, bad magic number %d (0x%x)",
tif->tif_header.tiff_magic,
tif->tif_header.tiff_magic);
goto bad;
}
TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian);
/*
* Swap header if required.
*/
if (tif->tif_flags & TIFF_SWAB) {
TIFFSwabShort(&tif->tif_header.tiff_version);
TIFFSwabLong(&tif->tif_header.tiff_diroff);
}
/*
* Now check version (if needed, it's been byte-swapped).
* Note that this isn't actually a version number, it's a
* magic number that doesn't change (stupid).
*/
if (tif->tif_header.tiff_version != TIFF_VERSION) {
TIFFError(name,
"Not a TIFF file, bad version number %d (0x%x)",
tif->tif_header.tiff_version,
tif->tif_header.tiff_version);
goto bad;
}
tif->tif_flags |= TIFF_MYBUFFER;
tif->tif_rawcp = tif->tif_rawdata = 0;
tif->tif_rawdatasize = 0;
/*
* Setup initial directory.
*/
switch (mode[0]) {
case 'r':
tif->tif_nextdiroff = tif->tif_header.tiff_diroff;
if (TIFFMapFileContents(tif, (tdata_t*) &tif->tif_base, &tif->tif_size))
tif->tif_flags |= TIFF_MAPPED;
if (TIFFReadDirectory(tif)) {
tif->tif_rawcc = -1;
tif->tif_flags |= TIFF_BUFFERSETUP;
return (tif);
}
break;
case 'a':
/*
* New directories are automatically append
* to the end of the directory chain when they
* are written out (see TIFFWriteDirectory).
*/
if (!TIFFDefaultDirectory(tif))
goto bad;
return (tif);
}
bad:
tif->tif_mode = O_RDONLY; /* XXX avoid flush */
TIFFClose(tif);
return ((TIFF*)0);
bad2:
(void) (*closeproc)(clientdata);
return ((TIFF*)0);
}
示例5: main
//.........这里部分代码省略.........
lseek(fd, BFH_SIZE, SEEK_SET);
read(fd, &info_hdr.iSize, 4);
#ifdef WORDS_BIGENDIAN
TIFFSwabLong(&info_hdr.iSize);
#endif
if (info_hdr.iSize == BIH_WIN4SIZE)
bmp_type = BMPT_WIN4;
else if (info_hdr.iSize == BIH_OS21SIZE)
bmp_type = BMPT_OS21;
else if (info_hdr.iSize == BIH_OS22SIZE
|| info_hdr.iSize == 16)
bmp_type = BMPT_OS22;
else
bmp_type = BMPT_WIN5;
if (bmp_type == BMPT_WIN4
|| bmp_type == BMPT_WIN5
|| bmp_type == BMPT_OS22) {
read(fd, &info_hdr.iWidth, 4);
read(fd, &info_hdr.iHeight, 4);
read(fd, &info_hdr.iPlanes, 2);
read(fd, &info_hdr.iBitCount, 2);
read(fd, &info_hdr.iCompression, 4);
read(fd, &info_hdr.iSizeImage, 4);
read(fd, &info_hdr.iXPelsPerMeter, 4);
read(fd, &info_hdr.iYPelsPerMeter, 4);
read(fd, &info_hdr.iClrUsed, 4);
read(fd, &info_hdr.iClrImportant, 4);
#ifdef WORDS_BIGENDIAN
TIFFSwabLong((uint32*) &info_hdr.iWidth);
TIFFSwabLong((uint32*) &info_hdr.iHeight);
TIFFSwabShort((uint16*) &info_hdr.iPlanes);
TIFFSwabShort((uint16*) &info_hdr.iBitCount);
TIFFSwabLong((uint32*) &info_hdr.iCompression);
TIFFSwabLong((uint32*) &info_hdr.iSizeImage);
TIFFSwabLong((uint32*) &info_hdr.iXPelsPerMeter);
TIFFSwabLong((uint32*) &info_hdr.iYPelsPerMeter);
TIFFSwabLong((uint32*) &info_hdr.iClrUsed);
TIFFSwabLong((uint32*) &info_hdr.iClrImportant);
#endif
n_clr_elems = 4;
}
if (bmp_type == BMPT_OS22) {
/*
* FIXME: different info in different documents
* regarding this!
*/
n_clr_elems = 3;
}
if (bmp_type == BMPT_OS21) {
int16 iShort;
read(fd, &iShort, 2);
#ifdef WORDS_BIGENDIAN
TIFFSwabShort((uint16*) &iShort);
#endif
info_hdr.iWidth = iShort;
read(fd, &iShort, 2);
#ifdef WORDS_BIGENDIAN
TIFFSwabShort((uint16*) &iShort);
#endif
info_hdr.iHeight = iShort;
示例6: TIFFRewriteDirectory
int
TIFFRewriteDirectory( TIFF *tif )
{
static const char module[] = "TIFFRewriteDirectory";
/* We don't need to do anything special if it hasn't been written. */
if( tif->tif_diroff == 0 )
return TIFFWriteDirectory( tif );
/*
** Find and zero the pointer to this directory, so that TIFFLinkDirectory
** will cause it to be added after this directories current pre-link.
*/
/* Is it the first directory in the file? */
if (tif->tif_header.tiff_diroff == tif->tif_diroff)
{
tif->tif_header.tiff_diroff = 0;
tif->tif_diroff = 0;
TIFFSeekFile(tif, (toff_t)(TIFF_MAGIC_SIZE+TIFF_VERSION_SIZE),
SEEK_SET);
if (!WriteOK(tif, &(tif->tif_header.tiff_diroff),
sizeof (tif->tif_diroff)))
{
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error updating TIFF header");
return (0);
}
}
else
{
toff_t nextdir, off;
nextdir = tif->tif_header.tiff_diroff;
do {
uint16 dircount;
if (!SeekOK(tif, nextdir) ||
!ReadOK(tif, &dircount, sizeof (dircount))) {
TIFFErrorExt(tif->tif_clientdata, module,
"Error fetching directory count");
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
(void) TIFFSeekFile(tif,
dircount * sizeof (TIFFDirEntry), SEEK_CUR);
if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
TIFFErrorExt(tif->tif_clientdata, module,
"Error fetching directory link");
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabLong(&nextdir);
} while (nextdir != tif->tif_diroff && nextdir != 0);
off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
(void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
tif->tif_diroff = 0;
if (!WriteOK(tif, &(tif->tif_diroff), sizeof (nextdir))) {
TIFFErrorExt(tif->tif_clientdata, module,
"Error writing directory link");
return (0);
}
}
/*
** Now use TIFFWriteDirectory() normally.
*/
return TIFFWriteDirectory( tif );
}
示例7: _TIFFWriteCustomDirectory
static int
_TIFFWriteCustomDirectory(TIFF* tif, toff_t *pdiroff)
{
uint16 dircount;
uint32 nfields;
tsize_t dirsize;
char* data;
TIFFDirEntry* dir;
TIFFDirectory* td;
unsigned long b, fields[FIELD_SETLONGS];
int fi, nfi;
if (tif->tif_mode == O_RDONLY)
return (1);
td = &tif->tif_dir;
/*
* Size the directory so that we can calculate
* offsets for the data items that aren't kept
* in-place in each field.
*/
nfields = 0;
for (b = 0; b <= FIELD_LAST; b++)
if (TIFFFieldSet(tif, b) && b != FIELD_CUSTOM)
nfields += (b < FIELD_SUBFILETYPE ? 2 : 1);
nfields += td->td_customValueCount;
dirsize = nfields * sizeof (TIFFDirEntry);
data = (char*) _TIFFmalloc(dirsize);
if (data == NULL) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Cannot write directory, out of space");
return (0);
}
/*
* Put the directory at the end of the file.
*/
tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1;
tif->tif_dataoff = (toff_t)(
tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t));
if (tif->tif_dataoff & 1)
tif->tif_dataoff++;
(void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET);
dir = (TIFFDirEntry*) data;
/*
* Setup external form of directory
* entries and write data items.
*/
_TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields));
for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) {
const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi];
/*
* For custom fields, we test to see if the custom field
* is set or not. For normal fields, we just use the
* FieldSet test.
*/
if( fip->field_bit == FIELD_CUSTOM )
{
int ci, is_set = FALSE;
for( ci = 0; ci < td->td_customValueCount; ci++ )
is_set |= (td->td_customValues[ci].info == fip);
if( !is_set )
continue;
}
else if (!FieldSet(fields, fip->field_bit))
continue;
if( fip->field_bit != FIELD_CUSTOM )
ResetFieldBit(fields, fip->field_bit);
}
/*
* Write directory.
*/
dircount = (uint16) nfields;
*pdiroff = (uint32) tif->tif_nextdiroff;
if (tif->tif_flags & TIFF_SWAB) {
/*
* The file's byte order is opposite to the
* native machine architecture. We overwrite
* the directory information with impunity
* because it'll be released below after we
* write it to the file. Note that all the
* other tag construction routines assume that
* we do this byte-swapping; i.e. they only
* byte-swap indirect data.
*/
for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) {
TIFFSwabArrayOfShort(&dir->tdir_tag, 2);
TIFFSwabArrayOfLong(&dir->tdir_count, 2);
}
dircount = (uint16) nfields;
TIFFSwabShort(&dircount);
TIFFSwabLong(pdiroff);
}
(void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET);
if (!WriteOK(tif, &dircount, sizeof (dircount))) {
//.........这里部分代码省略.........
示例8: TIFFGetRawTagIFDListEntry
/* scans first IDF and returns the type of the n-th tag */
ifd_entry_t TIFFGetRawTagIFDListEntry( TIFF * tif, int tagidx ) {
int count = TIFFGetRawTagListCount( tif);
#ifdef DEBUG
printf(" count of tags = %i\n", count);
#endif
int fd = TIFFFileno( tif);
//printf("count %i\n", count);
/* read count of tags (2 Bytes) */
int i;
ifd_entry_t ifd_entry;
/* replace i/o operatrions with in-memory-operations */
uint8 * ifdentries = NULL;
ifdentries = malloc ( sizeof(uint8) * 12 * count);
if (read(fd, ifdentries, 12 * count) != 12*count) {
perror ("TIFF Header read error4");
exit(EXIT_FAILURE);
}
uint8 * e = ifdentries;
for (i = 0; i<count; i++) {
uint8 lo = *e;
e++;
uint8 hi = *e;
uint16 tagid = (hi << 8) + lo;
e++;
if (TIFFIsByteSwapped(tif))
TIFFSwabShort(&tagid);
if (i == tagidx) {
// tag type check
lo = *e; e++;
hi = *e; e++;
uint16 tagtype = (hi << 8) + lo;
if (TIFFIsByteSwapped(tif))
TIFFSwabShort(&tagtype);
uint32 count = (*(e++));
count += (*(e++) << 8);
count += (*(e++) << 16);
count += (*(e++) << 24);
if (TIFFIsByteSwapped(tif))
TIFFSwabLong( &count);
#ifdef DEBUG
printf("\ncount=%0x\n\n", count);
#endif
/* is value or offset? */
/* TODO */
ifd_entry.count=count;
ifd_entry.datatype=tagtype;
uint8 data[4];
data[0] = *(e++);
data[1] = *(e++);
data[2] = *(e++);
data[3] = *(e++);
uint32 value_or_offset = (data[0]);
value_or_offset += (data[1] << 8);
value_or_offset += (data[2] << 16);
value_or_offset += (data[3] << 24);
if (TIFFIsByteSwapped(tif))
TIFFSwabLong( &value_or_offset);
switch( tagtype) {
case 1: /* 8-bit unsigned integer */
case 2: /* 8-bit bytes w/ last byte null */
case 6: /* !8-bit signed integer */
case 7: /* !8-bit untyped data */
if (count > 4) { /* offset */
ifd_entry.value_or_offset=is_offset;
ifd_entry.data32offset=value_or_offset;
} else { /* values */
ifd_entry.value_or_offset=is_value;
ifd_entry.data8[0] = data[0];
ifd_entry.data8[1] = data[1];
ifd_entry.data8[2] = data[2];
ifd_entry.data8[3] = data[3];
#ifdef DEBUG
printf("data8[0]=%u\n", data[0]);
printf("data8[1]=%u\n", data[1]);
printf("data8[2]=%u\n", data[2]);
printf("data8[3]=%u\n", data[3]);
#endif
}; break;
case 3: /* 16-bit unsigned integer */
case 8: /* !16-bit signed integer */
if (count > 2) { /* offset */
ifd_entry.value_or_offset=is_offset;
ifd_entry.data32offset=value_or_offset;
} else { /* values */
ifd_entry.value_or_offset=is_value;
uint16 w0 = (data[0]) + (data[1]<<8);
uint16 w1 = (data[2]) + (data[3]<<8);
if (TIFFIsByteSwapped(tif)) {
TIFFSwabShort( &w0 );
TIFFSwabShort( &w1 );
}
ifd_entry.data16[0] = w0;
ifd_entry.data16[1] = w1;
#ifdef DEBUG
printf("data16[0]=%u\n", w0);
printf("data16[1]=%u\n", w1);
#endif
//.........这里部分代码省略.........
示例9: EXIFExtractMetadata
CPLErr EXIFExtractMetadata(char**& papszMetadata,
void *fpInL, int nOffset,
int bSwabflag, int nTIFFHEADER,
int& nExifOffset, int& nInterOffset, int& nGPSOffset)
{
GUInt16 nEntryCount;
int space;
unsigned int n,i;
char pszTemp[MAXSTRINGLENGTH];
char pszName[128];
VSILFILE* fp = (VSILFILE* )fpInL;
TIFFDirEntry *poTIFFDirEntry;
TIFFDirEntry *poTIFFDir;
const struct tagname *poExifTags ;
const struct intr_tag *poInterTags = intr_tags;
const struct gpsname *poGPSTags;
/* -------------------------------------------------------------------- */
/* Read number of entry in directory */
/* -------------------------------------------------------------------- */
if( VSIFSeekL(fp, nOffset+nTIFFHEADER, SEEK_SET) != 0
|| VSIFReadL(&nEntryCount,1,sizeof(GUInt16),fp) != sizeof(GUInt16) )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Error reading EXIF Directory count at %d.",
nOffset + nTIFFHEADER );
return CE_Failure;
}
if (bSwabflag)
TIFFSwabShort(&nEntryCount);
// Some apps write empty directories - see bug 1523.
if( nEntryCount == 0 )
return CE_None;
// Some files are corrupt, a large entry count is a sign of this.
if( nEntryCount > 125 )
{
CPLError( CE_Warning, CPLE_AppDefined,
"Ignoring EXIF directory with unlikely entry count (%d).",
nEntryCount );
return CE_Warning;
}
poTIFFDir = (TIFFDirEntry *)CPLMalloc(nEntryCount * sizeof(TIFFDirEntry));
/* -------------------------------------------------------------------- */
/* Read all directory entries */
/* -------------------------------------------------------------------- */
n = VSIFReadL(poTIFFDir, 1,nEntryCount*sizeof(TIFFDirEntry),fp);
if (n != nEntryCount*sizeof(TIFFDirEntry))
{
CPLError( CE_Failure, CPLE_AppDefined,
"Could not read all directories");
CPLFree(poTIFFDir);
return CE_Failure;
}
/* -------------------------------------------------------------------- */
/* Parse all entry information in this directory */
/* -------------------------------------------------------------------- */
for(poTIFFDirEntry = poTIFFDir,i=nEntryCount; i > 0; i--,poTIFFDirEntry++) {
if (bSwabflag) {
TIFFSwabShort(&poTIFFDirEntry->tdir_tag);
TIFFSwabShort(&poTIFFDirEntry->tdir_type);
TIFFSwabLong (&poTIFFDirEntry->tdir_count);
TIFFSwabLong (&poTIFFDirEntry->tdir_offset);
}
/* -------------------------------------------------------------------- */
/* Find Tag name in table */
/* -------------------------------------------------------------------- */
pszName[0] = '\0';
pszTemp[0] = '\0';
for (poExifTags = tagnames; poExifTags->tag; poExifTags++)
if(poExifTags->tag == poTIFFDirEntry->tdir_tag) {
CPLAssert( NULL != poExifTags && NULL != poExifTags->name );
strcpy(pszName, poExifTags->name);
break;
}
if( nOffset == nGPSOffset) {
for( poGPSTags = gpstags; poGPSTags->tag != 0xffff; poGPSTags++ )
if( poGPSTags->tag == poTIFFDirEntry->tdir_tag ) {
CPLAssert( NULL != poGPSTags && NULL != poGPSTags->name );
strcpy(pszName, poGPSTags->name);
break;
}
}
/* -------------------------------------------------------------------- */
/* If the tag was not found, look into the interoperability table */
/* -------------------------------------------------------------------- */
if( nOffset == nInterOffset ) {
for(poInterTags = intr_tags; poInterTags->tag; poInterTags++)
//.........这里部分代码省略.........
示例10: dump
static void
dump(int fd, uint64 diroff)
{
unsigned i;
lseek(fd, (off_t) 0, 0);
if (read(fd, (char*) &hdr, sizeof (TIFFHeaderCommon)) != sizeof (TIFFHeaderCommon))
ReadError("TIFF header");
if (hdr.common.tiff_magic != TIFF_BIGENDIAN
&& hdr.common.tiff_magic != TIFF_LITTLEENDIAN &&
#if HOST_BIGENDIAN
/* MDI is sensitive to the host byte order, unlike TIFF */
MDI_BIGENDIAN != hdr.common.tiff_magic
#else
MDI_LITTLEENDIAN != hdr.common.tiff_magic
#endif
) {
Fatal("Not a TIFF or MDI file, bad magic number %u (%#x)",
hdr.common.tiff_magic, hdr.common.tiff_magic);
}
if (hdr.common.tiff_magic == TIFF_BIGENDIAN
|| hdr.common.tiff_magic == MDI_BIGENDIAN)
swabflag = !bigendian;
else
swabflag = bigendian;
if (swabflag)
TIFFSwabShort(&hdr.common.tiff_version);
if (hdr.common.tiff_version==42)
{
if (read(fd, (char*) &hdr.classic.tiff_diroff, 4) != 4)
ReadError("TIFF header");
if (swabflag)
TIFFSwabLong(&hdr.classic.tiff_diroff);
printf("Magic: %#x <%s-endian> Version: %#x <%s>\n",
hdr.classic.tiff_magic,
hdr.classic.tiff_magic == TIFF_BIGENDIAN ? "big" : "little",
42,"ClassicTIFF");
if (diroff == 0)
diroff = hdr.classic.tiff_diroff;
}
else if (hdr.common.tiff_version==43)
{
if (read(fd, (char*) &hdr.big.tiff_offsetsize, 12) != 12)
ReadError("TIFF header");
if (swabflag)
{
TIFFSwabShort(&hdr.big.tiff_offsetsize);
TIFFSwabShort(&hdr.big.tiff_unused);
TIFFSwabLong8(&hdr.big.tiff_diroff);
}
printf("Magic: %#x <%s-endian> Version: %#x <%s>\n",
hdr.big.tiff_magic,
hdr.big.tiff_magic == TIFF_BIGENDIAN ? "big" : "little",
43,"BigTIFF");
printf("OffsetSize: %#x Unused: %#x\n",
hdr.big.tiff_offsetsize,hdr.big.tiff_unused);
if (diroff == 0)
diroff = hdr.big.tiff_diroff;
bigtiff = 1;
}
else
Fatal("Not a TIFF file, bad version number %u (%#x)",
hdr.common.tiff_version, hdr.common.tiff_version);
for (i = 0; diroff != 0; i++) {
if (i > 0)
putchar('\n');
diroff = ReadDirectory(fd, i, diroff);
}
}
示例11: check_tagorder
ret_t check_tagorder(ctiff_t * ctif) {
tif_rules("tags are in ascending order");
thandle_t client = TIFFClientdata(ctif->tif);
TIFFReadWriteProc readproc = TIFFGetReadProc(ctif->tif);
TIFFSeekProc seekproc = TIFFGetSeekProc(ctif->tif);
if (! seekproc) {
perror ("could not get TIFFGetSeekProc");
}
if (! readproc) {
perror ("could not get TIFFGetReadProc");
}
uint32 offset = get_ifd0_pos(ctif);
int count = get_ifd0_count(ctif);
/* read count of tags (2 Bytes) */
int i;
/* replace i/o operatrions with in-memory-operations */
uint8 * ifdentries = NULL;
ifdentries = malloc ( sizeof(uint8) * 12 * count);
/*
if (read(fd, ifdentries, 12 * count) != 12*count) {
perror ("TIFF Header read error5");
exit(EXIT_FAILURE);
}
*/
seekproc(client, offset+2, SEEK_SET);
if ( readproc( client, ifdentries, 12 * count) != 12*count ) {
perror ("TIFF Header read error5");
exit( EXIT_FAILURE );
}
uint8 * e = ifdentries;
uint16 lasttag = 0;
for (i = 0; i<count; i++) {
uint8 lo = *e;
e++;
uint8 hi = *e;
uint16 tag = (hi << 8) + lo;
e++;
if (is_byteswapped(ctif))
TIFFSwabShort(&tag);
if (i>0 && lasttag >= tag) {
// printf("tag idx=%i, tag=%u (0x%04x) (0x%02x) (0x%02x)\n", i, tag, tag, hi, lo);
free( ifdentries );
// FIXME: tif_fails?
char array[TIFFAILSTRLEN];
snprintf(array, sizeof(array), "Invalid TIFF directory; tags are not sorted in ascending order, previous tag:%u (%s) , actual tag:%u (%s) at pos %i of %i\n", lasttag, TIFFTagName(lasttag), tag, TIFFTagName(tag), i, count);
return tif_fails(array);
}
lasttag = tag;
e+=10;
}
/* loop each tag until end or given tag found */
free( ifdentries );
ret_t res;
res.returnmsg=NULL;
res.returncode=0;
return res;
}
示例12: _TIFFWriteDirectory
//.........这里部分代码省略.........
tif->tif_subifdoff = tif->tif_diroff + TIFFDirCntLen(tif) +
(char*) &dir->s.tdir_offset - data;
if (!TIFFWriteLongArray(tif, dir, doff))
goto bad;
_TIFFfree(doff);
}
}
break;
default:
/* XXX: Should be fixed and removed. */
if (fip->field_tag == TIFFTAG_DOTRANGE) {
if (!TIFFSetupShortPair(tif, fip->field_tag, dir))
goto bad;
}
else if (!TIFFWriteNormalTag(tif, dir, fip))
goto bad;
break;
}
TDIREntryNext(tif,dir);
if( fip->field_bit != FIELD_CUSTOM )
ResetFieldBit(fields, fip->field_bit);
}
/*
* Check if BigTIFF now required based on data location. If so reset
* data offset to overwrite already-written data for directory, then
* convert file to BigTIFF and loop to recreate directory.
*/
if (isBigTIFF(tif) || !isBigOff(tif->tif_dataoff + sizeof(uint32)))
break;
_TIFFfree(data);
tif->tif_dataoff = tif->tif_diroff;
if (!TIFFMakeBigTIFF(tif))
goto bad2;
tif->tif_diroff = 0;
} /* bottom of BigTIFF retry loop */
/*
* Write directory.
*/
tif->tif_curdir++;
TIFFSetDirCnt(tif,dircount, (uint32) nfields);
TIFFSetDirOff(tif,diroff,tif->tif_nextdiroff);
if (tif->tif_flags & TIFF_SWAB) {
/*
* The file's byte order is opposite to the
* native machine architecture. We overwrite
* the directory information with impunity
* because it'll be released below after we
* write it to the file. Note that all the
* other tag construction routines assume that
* we do this byte-swapping; i.e. they only
* byte-swap indirect data.
*/
uint32 di;
for (dir = (TIFFDirEntry*) data, di = 0; di < nfields; TDIREntryNext(tif,dir), di++) {
TIFFSwabShort(&dir->s.tdir_tag);
TIFFSwabShort(&dir->s.tdir_type);
TDIRSwabEntryCount(tif,dir);
TDIRSwabEntryOff(tif,dir);
}
TIFFSwabDirCnt(tif,&dircount);
TIFFSwabDirOff(tif,&diroff);
}
(void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET);
if (!WriteOK(tif, &dircount, TIFFDirCntLen(tif))) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error writing directory count (%d)", TIFFGetErrno(tif));
goto bad;
}
if (!WriteOK(tif, data, dirsize)) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error writing directory contents (%d)", TIFFGetErrno(tif));
goto bad;
}
if (!WriteOK(tif, &diroff, TIFFDirOffLen(tif))) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error writing directory link (%d)", TIFFGetErrno(tif));
goto bad;
}
if (done) {
TIFFFreeDirectory(tif);
tif->tif_flags &= ~TIFF_DIRTYDIRECT;
(*tif->tif_cleanup)(tif);
/*
* Reset directory-related state for subsequent
* directories.
*/
TIFFCreateDirectory(tif);
}
_TIFFfree(data);
return (1);
bad:
_TIFFfree(data);
bad2:
return (0);
}
示例13: TIFFMakeBigTIFF
/*
* Function to convert standard TIFF file to BigTIFF file. Loop through all directories in
* current file (including subdirectories linked via SubIFD arrays) and create corresponding
* new directories with 64-bit arrays. The old 32-bit directories are left in the file as
* dead space. The data for directory entries are reused by default. Some directory entries
* require new data with 64-bit offsets (e.g. stripe/tile offsets and SubIFD arrays).
*
* Returns 1 if successful, 0 if cannot convert to BigTIFF (TIFF_NOBIGTIFF set
* or 32-bit API called).
*/
static int
TIFFMakeBigTIFF(TIFF *tif)
{
uint32 dirlink = TIFF_HEADER_DIROFF_S,
diroff = tif->tif_header.s.tiff_diroff;
toff_t dirlinkB = TIFF_HEADER_DIROFF_B,
diroffB;
uint16 dircount, dirindex;
uint64 dircountB;
tsize_t dirsize, dirsizeB;
int issubifd = 0;
uint32 subifdcnt = 0;
uint32 subifdlink;
toff_t subifdlinkB;
char *data, *dataB;
TIFFDirEntry *dir, *dirB;
/*
* Update flags and file header
*/
if (noBigTIFF(tif)) {
TIFFErrorExt((tif)->tif_clientdata,
"TIFFCheckBigTIFF", "File > 2^32 and NO BigTIFF specified");
return (0);
}
tif->tif_flags |= TIFF_ISBIGTIFF;
tif->tif_header.b.tiff_version = TIFF_BIGTIFF_VERSION;
tif->tif_header.b.tiff_offsize = 8;
tif->tif_header.b.tiff_fill = 0;
tif->tif_header.b.tiff_diroff = 0;
if (tif->tif_flags & TIFF_SWAB) {
TIFFSwabShort(&tif->tif_header.b.tiff_version);
TIFFSwabShort(&tif->tif_header.b.tiff_offsize);
}
if (!SeekOK(tif, 0) ||
!WriteOK(tif, &tif->tif_header, sizeof(TIFFHeader))) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error updating TIFF header (%d)", TIFFGetErrno(tif));
return (0);
}
if (tif->tif_flags & TIFF_SWAB) {
TIFFSwabShort(&tif->tif_header.b.tiff_version);
TIFFSwabShort(&tif->tif_header.b.tiff_offsize);
}
/*
* Loop through all directories and rewrite as BigTIFF with 64-bit offsets. This
* begins with main IFD chain but may divert to SubIFD arrays as needed.
*/
while (diroff != 0 && diroff != tif->tif_diroff) {
if (!SeekOK(tif, diroff) ||
!ReadOK(tif, &dircount, sizeof(dircount))) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error reading TIFF directory (%d)", TIFFGetErrno(tif));
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
dircountB = dircount;
if (!(data = _TIFFmalloc(dirsize = dircount * TIFFDirEntryLenS)) ||
!(dataB = _TIFFmalloc(dirsizeB = dircount * TIFFDirEntryLenB))) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error allocating space for directory");
return (0);
}
if (!SeekOK(tif, diroff + sizeof(dircount)) ||
!ReadOK(tif, data, dirsize)) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error reading TIFF directory (%d)", TIFFGetErrno(tif));
goto error;
}
diroffB = tif->tif_dataoff;
tif->tif_dataoff += sizeof(dircountB) + dirsizeB + sizeof(toff_t);
for (dirindex = 0; dirindex < dircount; dirindex++) {
dir = (TIFFDirEntry*) (data + dirindex * TIFFDirEntryLenS);
dirB = (TIFFDirEntry*) (dataB + dirindex * TIFFDirEntryLenB);
if (tif->tif_flags & TIFF_SWAB) {
TIFFSwabShort(&dir->s.tdir_tag);
TIFFSwabShort(&dir->s.tdir_type);
TIFFSwabLong(&dir->s.tdir_count);
TIFFSwabLong(&dir->s.tdir_offset);
}
dirB->b.tdir_tag = dir->s.tdir_tag;
dirB->b.tdir_type = dir->s.tdir_type;
dirB->b.tdir_count = dir->s.tdir_count;
dirB->b.tdir_offset = 0;
/*
* If data are in directory entry itself, copy data, else (data are pointed
* to by directory entry) copy pointer. This is complicated by the fact that
//.........这里部分代码省略.........
示例14: TIFFRewriteDirectory
/*
* Similar to TIFFWriteDirectory(), but if the directory has already
* been written once, it is relocated to the end of the file, in case it
* has changed in size. Note that this will result in the loss of the
* previously used directory space.
*/
int
TIFFRewriteDirectory( TIFF *tif )
{
static const char module[] = "TIFFRewriteDirectory";
/* We don't need to do anything special if it hasn't been written. */
if( tif->tif_diroff == 0 )
return TIFFWriteDirectory( tif );
/*
** Find and zero the pointer to this directory, so that TIFFLinkDirectory
** will cause it to be added after this directories current pre-link.
*/
/* Is it the first directory in the file? */
if (TIFFGetHdrDirOff(tif,tif->tif_header) == tif->tif_diroff)
{
TIFFSetHdrDirOff(tif,tif->tif_header,0);
tif->tif_diroff = 0;
if (!SeekOK(tif, 0) ||
!WriteOK(tif, &tif->tif_header, sizeof(TIFFHeader))) {
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
"Error updating TIFF header (%d)", TIFFGetErrno(tif));
return (0);
}
}
else
{
toff_t nextdir, off;
toff_t nextdiroff; /* 32-bit or 64-bit directory offset */
nextdir = TIFFGetHdrDirOff(tif,tif->tif_header);
do {
uint16 dircount;
if (!SeekOK(tif, nextdir) ||
!ReadOK(tif, &dircount, sizeof (dircount))) {
TIFFErrorExt(tif->tif_clientdata, module,
"Error fetching directory count (%d)", TIFFGetErrno(tif));
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
(void) TIFFSeekFile(tif, TIFFGetDirCnt(tif,dircount) * TDIREntryLen(tif), SEEK_CUR);
if (!ReadOK(tif, &nextdiroff, TIFFDirOffLen(tif))) {
TIFFErrorExt(tif->tif_clientdata, module,
"Error fetching directory link (%d)", TIFFGetErrno(tif));
return (0);
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabDirOff(tif,&nextdiroff);
nextdir = TIFFGetDirOff(tif,nextdiroff);
} while (nextdir != tif->tif_diroff && nextdir != 0);
off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
(void) TIFFSeekFile(tif, off - TIFFDirOffLen(tif), SEEK_SET);
tif->tif_diroff = 0;
if (!WriteOK(tif, &(tif->tif_diroff), TIFFDirOffLen(tif))) {
TIFFErrorExt(tif->tif_clientdata, module,
"Error writing directory link (%d)", TIFFGetErrno(tif));
return (0);
}
}
/*
** Now use TIFFWriteDirectory() normally.
*/
return TIFFWriteDirectory( tif );
}
示例15: scan_mem_map
//.........这里部分代码省略.........
if (ret.returncode != is_valid) {
fprintf(stderr, "error reading offset data, stripoffset_entry.count has size %u, resulting address %zu, but only offset to %lu is possible\n", stripoffset_entry.count, ((uint64) stripoffset_entry.count*sizeof(uint32)), (uint64) 0xffffffff);
exit(EXIT_FAILURE);
}
uint32 * p = offset.data32p;
if ((uint64) stripoffset_entry.count*sizeof(uint32) > 0xffffffff) {
fprintf(stderr, "stripoffset_entry.count has size %u, resulting address %zu, but only offset to %lu is possible\n", stripoffset_entry.count, ((uint64) stripoffset_entry.count*sizeof(uint32)), (uint64) 0xffffffff);
exit(EXIT_FAILURE);
}
for (uint32 i=0; i< stripoffset_entry.count; i++) {
uint32 pval = *p;
if (is_byteswapped(ctif)) {
TIFFSwabLong(&pval);
}
stripoffset_values[i]=pval;
p++;
}
}
break;
}
case TIFF_SHORT: {
/* value */
if (stripoffset_entry.value_or_offset == is_value) {
for (uint32 i=0; i< stripoffset_entry.count; i++) {
stripoffset_values[i]= stripoffset_entry.data16[i];
}
}
/* offset */
if (stripoffset_entry.value_or_offset == is_offset) {
offset_t offset;
ret_t ret = read_offsetdata(ctif, stripoffset_entry.data32offset, stripoffset_entry.count, stripoffset_entry.datatype, &offset, &ret);
if (ret.returncode != is_valid) {
fprintf(stderr, "error reading offset data, stripoffset_entry.count has size %u, resulting address %zu, but only offset to %lu is possible\n", stripoffset_entry.count, ((uint64) stripoffset_entry.count*sizeof(uint32)), (uint64) 0xffffffff);
exit(EXIT_FAILURE);
}
uint16 * p = offset.data16p;
if ((uint64) stripoffset_entry.count*sizeof(uint16) > 0xffffffff) {
fprintf(stderr, "stripoffset_entry.count has size %u, resulting address %zu, but only offset to %lu is possible\n", stripoffset_entry.count, ((uint64) stripoffset_entry.count*sizeof(uint16)), (uint64) 0xffffffff);
exit(EXIT_FAILURE);
}
for (uint32 i=0; i< count; i++) {
uint16 pval = *p;
if (is_byteswapped(ctif)) {
TIFFSwabShort(&pval);
}
stripoffset_values[i]=pval;
p++;
}
}
break;
}
default: {
perror("stripoffset_entry.datatype has an unexpected value, possible a program error\n");
exit(EXIT_FAILURE);
}
}
//printf("count=%i\n", stripoffset_entry.count);
/*TODO:
for (int i=0; i< stripoffset_entry.count; i++) {
uint32 rawstriplen = TIFFRawStripSize(ctif->tif, i);
//printf("OFFSET: p[%i]=%u len=%i\n", i,stripoffset_values[i], rawstriplen);
add_mem_entry( &memmap, stripoffset_values[i], rawstriplen, mt_stripoffset_value);
}
*/
/* sort entries by offset */
qsort(memmap.base_p, memmap.count, sizeof( mem_map_entry_t), compare_memmap);
/*
printf("memmap before HOLE detection\n");
print_mem_map( &memmap );
printf("----------------------------\n");
*/
/* add all unused areas */
uint32 memmap_orig_count = memmap.count;
for (uint32 j=1; j< memmap_orig_count; j++) {
mem_map_entry_t * prev=memmap.base_p+j-1;
mem_map_entry_t * act =memmap.base_p+j;
uint32 estimated_offset = (prev->offset + prev->count);
if (estimated_offset < act->offset) { /* found a hole */
printf("HOLE FOUND at %u\n", estimated_offset);
printf("\tprev->offset=%u prev->count=%u estimated=%u\n", prev->offset, prev->count, estimated_offset);
printf("\tact->offset=%u act->count=%u\n", act->offset, act->count);
add_mem_entry( &memmap, estimated_offset, (act->offset -estimated_offset), mt_unused);
}
}
/* sort entries by offset again */
qsort(memmap.base_p, memmap.count, sizeof( mem_map_entry_t), compare_memmap);
/* add unused area at end */
mem_map_entry_t * last = memmap.base_p + memmap.count-1;
uint32 estimated_offset = (last->offset + last->count);
if (memmap.max_len > estimated_offset) {
printf("HOLE (at end) FOUND at %u\n", estimated_offset);
add_mem_entry( &memmap, estimated_offset, (memmap.max_len -estimated_offset), mt_unused);
}
/* sort entries by offset again */
qsort(memmap.base_p, memmap.count, sizeof( mem_map_entry_t), compare_memmap);
return &memmap;
}