1 /* 7zItem.c */
2
3 #include "7zItem.h"
4 #include "7zAlloc.h"
5
SzCoderInfoInit(CCoderInfo * coder)6 void SzCoderInfoInit(CCoderInfo *coder)
7 {
8 SzByteBufferInit(&coder->Properties);
9 }
10
SzCoderInfoFree(CCoderInfo * coder,void (* freeFunc)(void * p))11 void SzCoderInfoFree(CCoderInfo *coder, void (*freeFunc)(void *p))
12 {
13 SzByteBufferFree(&coder->Properties, freeFunc);
14 SzCoderInfoInit(coder);
15 }
16
SzFolderInit(CFolder * folder)17 void SzFolderInit(CFolder *folder)
18 {
19 folder->NumCoders = 0;
20 folder->Coders = 0;
21 folder->NumBindPairs = 0;
22 folder->BindPairs = 0;
23 folder->NumPackStreams = 0;
24 folder->PackStreams = 0;
25 folder->UnPackSizes = 0;
26 folder->UnPackCRCDefined = 0;
27 folder->UnPackCRC = 0;
28 folder->NumUnPackStreams = 0;
29 }
30
SzFolderFree(CFolder * folder,void (* freeFunc)(void * p))31 void SzFolderFree(CFolder *folder, void (*freeFunc)(void *p))
32 {
33 UInt32 i;
34 for (i = 0; i < folder->NumCoders; i++)
35 SzCoderInfoFree(&folder->Coders[i], freeFunc);
36 freeFunc(folder->Coders);
37 freeFunc(folder->BindPairs);
38 freeFunc(folder->PackStreams);
39 freeFunc(folder->UnPackSizes);
40 SzFolderInit(folder);
41 }
42
SzFolderGetNumOutStreams(CFolder * folder)43 UInt32 SzFolderGetNumOutStreams(CFolder *folder)
44 {
45 UInt32 result = 0;
46 UInt32 i;
47 for (i = 0; i < folder->NumCoders; i++)
48 result += folder->Coders[i].NumOutStreams;
49 return result;
50 }
51
SzFolderFindBindPairForInStream(CFolder * folder,UInt32 inStreamIndex)52 int SzFolderFindBindPairForInStream(CFolder *folder, UInt32 inStreamIndex)
53 {
54 UInt32 i;
55 for(i = 0; i < folder->NumBindPairs; i++)
56 if (folder->BindPairs[i].InIndex == inStreamIndex)
57 return i;
58 return -1;
59 }
60
61
SzFolderFindBindPairForOutStream(CFolder * folder,UInt32 outStreamIndex)62 int SzFolderFindBindPairForOutStream(CFolder *folder, UInt32 outStreamIndex)
63 {
64 UInt32 i;
65 for(i = 0; i < folder->NumBindPairs; i++)
66 if (folder->BindPairs[i].OutIndex == outStreamIndex)
67 return i;
68 return -1;
69 }
70
SzFolderGetUnPackSize(CFolder * folder)71 CFileSize SzFolderGetUnPackSize(CFolder *folder)
72 {
73 int i = (int)SzFolderGetNumOutStreams(folder);
74 if (i == 0)
75 return 0;
76 for (i--; i >= 0; i--)
77 if (SzFolderFindBindPairForOutStream(folder, i) < 0)
78 return folder->UnPackSizes[i];
79 /* throw 1; */
80 return 0;
81 }
82
83 /*
84 int FindPackStreamArrayIndex(int inStreamIndex) const
85 {
86 for(int i = 0; i < PackStreams.Size(); i++)
87 if (PackStreams[i] == inStreamIndex)
88 return i;
89 return -1;
90 }
91 */
92
SzFileInit(CFileItem * fileItem)93 void SzFileInit(CFileItem *fileItem)
94 {
95 fileItem->IsFileCRCDefined = 0;
96 fileItem->HasStream = 1;
97 fileItem->IsDirectory = 0;
98 fileItem->IsAnti = 0;
99 fileItem->Name = 0;
100 }
101
SzFileFree(CFileItem * fileItem,void (* freeFunc)(void * p))102 void SzFileFree(CFileItem *fileItem, void (*freeFunc)(void *p))
103 {
104 freeFunc(fileItem->Name);
105 SzFileInit(fileItem);
106 }
107
SzArchiveDatabaseInit(CArchiveDatabase * db)108 void SzArchiveDatabaseInit(CArchiveDatabase *db)
109 {
110 db->NumPackStreams = 0;
111 db->PackSizes = 0;
112 db->PackCRCsDefined = 0;
113 db->PackCRCs = 0;
114 db->NumFolders = 0;
115 db->Folders = 0;
116 db->NumFiles = 0;
117 db->Files = 0;
118 }
119
SzArchiveDatabaseFree(CArchiveDatabase * db,void (* freeFunc)(void *))120 void SzArchiveDatabaseFree(CArchiveDatabase *db, void (*freeFunc)(void *))
121 {
122 UInt32 i;
123 for (i = 0; i < db->NumFolders; i++)
124 SzFolderFree(&db->Folders[i], freeFunc);
125 for (i = 0; i < db->NumFiles; i++)
126 SzFileFree(&db->Files[i], freeFunc);
127 freeFunc(db->PackSizes);
128 freeFunc(db->PackCRCsDefined);
129 freeFunc(db->PackCRCs);
130 freeFunc(db->Folders);
131 freeFunc(db->Files);
132 SzArchiveDatabaseInit(db);
133 }
134