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