blob: cad9817b8337ef762b7f8f3f034877860f713b88 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#include "compound-file-difat.h"
#include "compound-file-common.h"
#include "emb-logging.h"
#include "helpers-binary.h"
#include <stdlib.h>
static const unsigned int sizeOfDifatEntry = 4;
static const unsigned int sizeOfChainingEntryAtEndOfDifatSector = 4;
bcf_file_difat* bcf_difat_create(EmbFile* file, unsigned int fatSectors, const unsigned int sectorSize)
{
unsigned int i;
bcf_file_difat* difat = 0;
unsigned int sectorRef;
difat = (bcf_file_difat*)malloc(sizeof(bcf_file_difat));
if(!difat) { embLog_error("compound-file-difat.c bcf_difat_create(), cannot allocate memory for difat\n"); } /* TODO: avoid crashing. null pointer will be accessed */
difat->sectorSize = sectorSize;
if(fatSectors > NumberOfDifatEntriesInHeader)
{
fatSectors = NumberOfDifatEntriesInHeader;
}
for(i = 0; i < fatSectors; ++i)
{
sectorRef = binaryReadUInt32(file);
difat->fatSectorEntries[i] = sectorRef;
}
difat->fatSectorCount = fatSectors;
for(i = fatSectors; i < NumberOfDifatEntriesInHeader; ++i)
{
sectorRef = binaryReadUInt32(file);
if(sectorRef != CompoundFileSector_FreeSector)
{
embLog_error("compound-file-difat.c bcf_difat_create(), Unexpected sector value %x at DIFAT[%d]\n", sectorRef, i);
}
}
return difat;
}
unsigned int numberOfEntriesInDifatSector(bcf_file_difat* fat)
{
return (fat->sectorSize - sizeOfChainingEntryAtEndOfDifatSector ) / sizeOfDifatEntry;
}
unsigned int readFullSector(EmbFile* file, bcf_file_difat* bcfFile, unsigned int* numberOfDifatEntriesStillToRead)
{
unsigned int i;
unsigned int sectorRef;
unsigned int nextDifatSectorInChain;
unsigned int entriesToReadInThisSector = 0;
if(*numberOfDifatEntriesStillToRead > numberOfEntriesInDifatSector(bcfFile))
{
entriesToReadInThisSector = numberOfEntriesInDifatSector(bcfFile);
*numberOfDifatEntriesStillToRead -= entriesToReadInThisSector;
}
else
{
entriesToReadInThisSector = *numberOfDifatEntriesStillToRead;
*numberOfDifatEntriesStillToRead = 0;
}
for(i = 0; i < entriesToReadInThisSector; ++i)
{
sectorRef = binaryReadUInt32(file);
bcfFile->fatSectorEntries[bcfFile->fatSectorCount]= sectorRef;
bcfFile->fatSectorCount++;
}
for(i = entriesToReadInThisSector; i < numberOfEntriesInDifatSector(bcfFile); ++i)
{
sectorRef = binaryReadUInt32(file);
if(sectorRef != CompoundFileSector_FreeSector)
{
embLog_error("compound-file-difat.c readFullSector(), Unexpected sector value %x at DIFAT[%d]]\n", sectorRef, i);
}
}
nextDifatSectorInChain = binaryReadUInt32(file);
return nextDifatSectorInChain;
}
void bcf_file_difat_free(bcf_file_difat* difat)
{
free(difat);
difat = 0;
}
/* kate: bom off; indent-mode cstyle; indent-width 4; replace-trailing-space-save on; */
|