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