1 /*---------------------------------------------------------------------------*
2   Project:  header for archiver for Revolution dvd
3   File:     darch.h
4 
5   Copyright (C) 2001-2006 Nintendo All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: darch.h,v $
14   Revision 1.2  2007/11/13 07:02:09  nakano_yoshinobu
15   Fixed path names of files in .arc file.
16 
17   Revision 1.1  2006/04/20 01:41:01  hiratsu
18   Initial check-in.
19 
20 
21     1     7/02/01 11:34p Hashida
22     Initial revision.
23 
24   $NoKeywords: $
25  *---------------------------------------------------------------------------*/
26 
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <io.h>
31 #include <fcntl.h>
32 #include <errno.h>
33 #include <sys/stat.h>
34 #include <assert.h>
35 #include <revolution/dvd.h>
36 #include <revolution/arc.h>
37 
38 typedef struct diskMap diskMap;
39 
40 struct diskMap
41 {
42     int       fstPosition;
43     int       fstLength;
44     int       userFilePosition;
45     int       userFileLength;
46 
47 };
48 
49 typedef struct FSTEntryInfo FSTEntryInfo;
50 
51 struct FSTEntryInfo
52 {
53     FSTEntryInfo*  next;
54     int      entryNum;
55     char     pathName[FILENAME_MAX];
56     char*    name;
57     int      nameOffset;
58     BOOL     isDir;
59     int      parentEntry;      // dir only
60     int      nextEntry;        // dir only: next entry under the same dir
61     int      filePosition;     // file only
62     int      fileLength;       // file only
63 };
64 
65 typedef struct FSTEntry FSTEntry;
66 
67 struct FSTEntry
68 {
69     unsigned int    isDirAndStringOff;    // the first byte is for isDir
70                                           // the next 3bytes: name offset
71     unsigned int    parentOrPosition;     // parent entry (dir entry)
72                                           // position (file entry)
73     unsigned int    nextEntryOrLength;    // next entry (dir entry)
74                                           // length (file entry)
75 };
76 
77 typedef struct
78 {
79     char            name[FILENAME_MAX];
80     int             fid;
81     int             currEntry;
82     int             entryNum;
83     int             stringStartOffset;
84     char*           stringStart;
85     FSTEntry*       fst;
86     int             fileStart;
87 
88 } DarchHandle;
89 
90 
91 #define roundUp4B(x)       (((unsigned int)(x) + 4 - 1) & \
92                                               ~(4 - 1))
93 #define roundUp32B(x)      (((unsigned int)(x) + 32 - 1) & \
94                                               ~(32 - 1))
95 
96 
97 /*---------------------------------------------------------------------------*
98   Name:         setData
99 
100   Description:  macro to set data in big endian
101 
102   Arguments:    addr         address to set data
103                 data         data to set
104                 offset       data is set from addr+offset
105                 nbytes       data length
106 
107   Returns:      none
108  *---------------------------------------------------------------------------*/
109 #define setData(addr, data, offset, nbytes)    do {                        \
110  int ___i;                                                                 \
111  for (___i = 0; ___i < nbytes; ___i++)                                           \
112  { \
113     *( (char*)(addr) + offset + ___i )                                     \
114    = ( (data) >> (8*(nbytes - ___i - 1)) ) & 0xff;                 \
115  }\
116 } while(0)
117 
118 
119 
120 /*
121  *    0     1           4                8              11
122  *   +-----+-----------+----------------+-----------------+
123  *   |ISDIR| STRINGOFF | PARENT or      | Next Entry or   |
124  *   |     |           |      Position  |         Length  |
125  *   +-----+-----------+----------------+-----------------+
126  */
127 #define   ISDIR_OFFSET                 0
128 #define   ISDIR_LENGTH                 1
129 #define   STRINGOFF_OFFSET             1
130 #define   STRINGOFF_LENGTH             3
131 #define   PARENT_OFFSET                4
132 #define   PARENT_LENGTH                4
133 #define   POSITION_OFFSET              4
134 #define   POSITION_LENGTH              4
135 #define   NEXTENTRY_OFFSET             8
136 #define   NEXTENTRY_LENGTH             4
137 #define   LENGTH_OFFSET                8
138 #define   LENGTH_LENGTH                4
139 
140 #define setIsDir(eAddr, data)          \
141           setData(eAddr, data, ISDIR_OFFSET, ISDIR_LENGTH)
142 #define setStringOff(eAddr, data)      \
143           setData(eAddr, data, STRINGOFF_OFFSET, STRINGOFF_LENGTH)
144 #define setParent(eAddr, data)         \
145           setData(eAddr, data, PARENT_OFFSET, PARENT_LENGTH)
146 #define setPosition(eAddr, data)       \
147           setData(eAddr, data, POSITION_OFFSET, POSITION_LENGTH)
148 #define setNextEntry(eAddr, data)      \
149           setData(eAddr, data, NEXTENTRY_OFFSET, NEXTENTRY_LENGTH)
150 #define setLength(eAddr, data)         \
151           setData(eAddr, data, LENGTH_OFFSET, LENGTH_LENGTH)
152 #define set4BData(eAddr, data, offset) \
153           setData(eAddr, data, offset, 4)
154 
155 #define RoundUp32B(x)           (((u32)(x) + 32 - 1) & ~(32 - 1))
156 #define RoundDown32B(x)         (((u32)(x)) & ~(32 - 1))
157 
158 #define RoundUp4B(x)           (((u32)(x) + 4 - 1) & ~(4 - 1))
159 #define RoundDown4B(x)         (((u32)(x)) & ~(4 - 1))
160 
161 #define REV32(data)             ( ( ((data) & 0xff000000) >> 24 ) |       \
162                                   ( ((data) & 0x00ff0000) >> 8  ) |       \
163                                   ( ((data) & 0x0000ff00) << 8  ) |       \
164                                   ( ((data) & 0x000000ff) << 24 ) )
165 
166 #define entryIsDir(entry)     \
167     ( ( ( REV32((entry)->isDirAndStringOff) & 0xff000000 ) == 0 )? FALSE:TRUE )
168 #define stringOff(entry)      \
169         ( REV32((entry)->isDirAndStringOff) & 0x00ffffff )
170 #define parentDir(entry)       \
171         ( REV32((entry)->parentOrPosition) )
172 #define nextDir(entry)        \
173         ( REV32((entry)->nextEntryOrLength) )
174 #define filePosition(entry)       \
175         ( REV32((entry)->parentOrPosition) )
176 #define fileLength(entry)         \
177         ( REV32((entry)->nextEntryOrLength) )
178 
179 /*
180  * FST max size ... 1M bytes
181  *  This is because bs2 assumes that.
182  */
183 //#define FST_MAX_SIZE                    0x00100000
184 
185 #define MIN(x, y)                       (((x) < (y))? (x) : (y))
186 
187 
188 typedef struct
189 {
190     char*           currDir;
191     char**          argStart;
192     int             argNum;
193 
194 } Arg_s;
195 
196 extern int makeFST(void);
197 extern int makeOutFile(char* name);
198 extern void makeTmpFileNames(void);
199 
200 extern void ListArc(char* name);
201 extern void ListArcInDiscOrder(char* name);
202 extern void ExtractArc(char* name, char* root);
203 extern void DiffArc(char* name, char* root);
204 extern void DeleteArc(char* arcFile, Arg_s* arg, int count);
205 extern void ReplaceArc(char* arcFile, Arg_s* arg, int count);
206 extern void CreateArc(char* arcFile, Arg_s* arg, int count);
207 
208 extern void CopyUtility(int srcfid, int srcoff, int dstfid, int dstoff, int size);
209 extern BOOL DiffUtility(int fidA, int Aoff, int fidB, int Boff, int size);
210 
211 
212 extern char fstFile[FILENAME_MAX];
213 extern char userFile[FILENAME_MAX];
214 
215 extern char arcRoot[FILENAME_MAX];
216 
217 extern diskMap map;
218 extern char* progName;
219 extern int  debugMode;
220 extern int  verbose;
221 extern void* BigBuffer;
222 
223 #define ALLOC_MEMSIZE           (16*1024*1024)
224 
225 //for VC2005
226 #pragma warning(disable: 4996)
227 
228