Commit 6a6d7496141daac6e420ff1f48ef84b890bea042

Authored by Imanol-Mikel Barba Sabariego
1 parent ab8cd4ec

Added getopt() options and fixed a bug caused by omission of ownerUUID parameter in search

Showing 1 changed file with 93 additions and 21 deletions
mcpetbackup.c
1 #include <stdio.h> 1 #include <stdio.h>
  2 +#include <getopt.h>
2 3
3 #include "nbt.h" 4 #include "nbt.h"
4 #include "chunk.h" 5 #include "chunk.h"
5 6
  7 +enum paramIndex
  8 +{
  9 + UNKNOWN = 0,
  10 + REGION,
  11 + SAVE,
  12 + LOAD,
  13 + NAME,
  14 + OWNER
  15 +};
  16 +
  17 +static struct option longopts[] = {
  18 + { "regiondata", required_argument, NULL, REGION },
  19 + { "save", required_argument, NULL, SAVE },
  20 + { "load", required_argument, NULL, LOAD },
  21 + { "name", required_argument, NULL, NAME },
  22 + { "owner", required_argument, NULL, OWNER },
  23 + { NULL, 0, NULL, UNKNOWN }
  24 +};
  25 +
6 int savePetToFile(Tag* pet, const char* filename) { 26 int savePetToFile(Tag* pet, const char* filename) {
7 void* petData; 27 void* petData;
8 size_t petDataLength = composeTag(*pet, &petData); 28 size_t petDataLength = composeTag(*pet, &petData);
@@ -181,17 +201,69 @@ ssize_t insertPetIntoChunk(void** chunkData, Tag chunkRoot, Tag* entities, Tag p @@ -181,17 +201,69 @@ ssize_t insertPetIntoChunk(void** chunkData, Tag chunkRoot, Tag* entities, Tag p
181 return chunkDataLength; 201 return chunkDataLength;
182 } 202 }
183 203
  204 +void printHelp() {
  205 + fprintf(stderr,"--regiondata ./industrial/world/region --save Iris.mcdata --name Iris\n");
  206 + fprintf(stderr,"--regiondata ./industrial/world/region --save Iris.mcdata --owner 32812f90-17ec-4f5a-8b7e-e500f17b1ba5\n");
  207 + fprintf(stderr,"--regiondata ./industrial/world/region --load Iris.mcdata\n");
  208 +}
  209 +
184 int main(int argc, char** argv) { 210 int main(int argc, char** argv) {
185 - // TODO argv  
186 - // --regiondata ./industrial/world/region --save Iris.mcdata --name Iris  
187 - // --regiondata ./industrial/world/region --save Iris.mcdata --owner 32812f90-17ec-4f5a-8b7e-e500f17b1ba5  
188 - // --regiondata ./industrial/world/region --load Iris.mcdata  
189 -  
190 - const char* regionFolder = "./industrial/world/region";  
191 - const char* petName = "Iris"; 211 + const char* regionFolder = NULL;
  212 + const char* file = NULL;
  213 + const char* petName = NULL;
  214 + const char* ownerUUID = NULL;
192 int save = 0; 215 int save = 0;
193 - const char* outputFile = "Iris.mcdata";  
194 - const char* inputFile = "Iris.mcdata"; 216 +
  217 + int longIndex = UNKNOWN;
  218 + int c;
  219 +
  220 + if(argc < 2) {
  221 + fprintf(stderr,"No options specified\n\n");
  222 + fprintf(stderr,"Examples:\n");
  223 + printHelp();
  224 + return 0;
  225 + }
  226 +
  227 + while ((c = getopt_long(argc, argv, "r:s:l:n:o:h", longopts, &longIndex)) != -1)
  228 + {
  229 + if(c == 'h') {
  230 + printHelp();
  231 + return 0;
  232 + }
  233 + else if(c == REGION) {regionFolder = optarg;}
  234 + else if(c == SAVE) {save = 1;file = optarg;}
  235 + else if(c == LOAD) {file = optarg;}
  236 + else if(c == NAME) {petName = optarg;}
  237 + else if(c == OWNER) {ownerUUID = optarg;}
  238 + else {
  239 + fprintf(stderr,"Unrecognised argument: %s\n",optarg);
  240 + printHelp();
  241 + return 1;
  242 + }
  243 + }
  244 + if(optind != argc) {
  245 + fprintf(stderr,"Unrecognised argument: %s\n",argv[optind+1]);
  246 + printHelp();
  247 + return 1;
  248 + }
  249 +
  250 + if(regionFolder == NULL) {
  251 + fprintf(stderr,"Region path not specified (--regionpath PATH_TO_REGION_FOLDER)\n");
  252 + printHelp();
  253 + return 2;
  254 + } else if(save && petName == NULL && ownerUUID == NULL) {
  255 + fprintf(stderr,"OwnerUUID and petName were unspecified (--owner UUID, --name PET_NAME)\n");
  256 + printHelp();
  257 + return 3;
  258 + } else if(!save && (petName != NULL || ownerUUID != NULL)) {
  259 + fprintf(stderr,"OwnerUUID and petName were unspecified (--owner UUID, --name PET_NAME)\n");
  260 + printHelp();
  261 + return 3;
  262 + } else if(file == NULL) {
  263 + fprintf(stderr,"Neither saving or loading a pet was requested (--save PATH_TO_FILE, --load PATH_TO_FILE)\n");
  264 + printHelp();
  265 + return 4;
  266 + }
195 267
196 void *chunkData; 268 void *chunkData;
197 ChunkID chunk = translateCoordsToChunk(800, 200, 3041); 269 ChunkID chunk = translateCoordsToChunk(800, 200, 3041);
@@ -205,45 +277,45 @@ int main(int argc, char** argv) { @@ -205,45 +277,45 @@ int main(int argc, char** argv) {
205 if(pos != chunkLen) { 277 if(pos != chunkLen) {
206 fprintf(stderr, "Didn't reach end of NBT file\n"); 278 fprintf(stderr, "Didn't reach end of NBT file\n");
207 free(chunkData); 279 free(chunkData);
208 - return 1; 280 + return 5;
209 } 281 }
210 282
211 Tag* entities; 283 Tag* entities;
212 if(getEntitiesTag((TagCompound*)t.payload,&entities)) { 284 if(getEntitiesTag((TagCompound*)t.payload,&entities)) {
213 fprintf(stderr, "Unable to find Entities tag\n"); 285 fprintf(stderr, "Unable to find Entities tag\n");
214 free(chunkData); 286 free(chunkData);
215 - return 2; 287 + return 6;
216 } 288 }
217 if(save) { 289 if(save) {
218 Tag* pet; 290 Tag* pet;
219 - if(searchForPet(*entities,petName,NULL,&pet)) { 291 + if(searchForPet(*entities,petName,ownerUUID,&pet)) {
220 fprintf(stderr, "Unable to find pet named %s\n",petName); 292 fprintf(stderr, "Unable to find pet named %s\n",petName);
221 free(chunkData); 293 free(chunkData);
222 - return 3; 294 + return 7;
223 } 295 }
224 - if(savePetToFile(pet,outputFile)) {  
225 - fprintf(stderr, "Unable to save pet to file: %s\n",outputFile); 296 + if(savePetToFile(pet,file)) {
  297 + fprintf(stderr, "Unable to save pet to file: %s\n",file);
226 free(chunkData); 298 free(chunkData);
227 - return 4; 299 + return 8;
228 } 300 }
229 } else { 301 } else {
230 Tag pet; 302 Tag pet;
231 - if(loadPetFromFile(&pet,inputFile)) {  
232 - fprintf(stderr, "Unable to load pet from file: %s\n",inputFile); 303 + if(loadPetFromFile(&pet,file)) {
  304 + fprintf(stderr, "Unable to load pet from file: %s\n",file);
233 free(chunkData); 305 free(chunkData);
234 - return 5; 306 + return 9;
235 } 307 }
236 chunkLen = insertPetIntoChunk(&chunkData,t,entities,pet,801,200,3040); 308 chunkLen = insertPetIntoChunk(&chunkData,t,entities,pet,801,200,3040);
237 if(chunkLen <= 0) { 309 if(chunkLen <= 0) {
238 fprintf(stderr, "Unable to insert pet into chunk\n"); 310 fprintf(stderr, "Unable to insert pet into chunk\n");
239 free(chunkData); 311 free(chunkData);
240 - return 6; 312 + return 10;
241 } 313 }
242 destroyTag(&pet); 314 destroyTag(&pet);
243 if(overwriteChunk(regionFolder, chunk, chunkData, chunkLen)) { 315 if(overwriteChunk(regionFolder, chunk, chunkData, chunkLen)) {
244 fprintf(stderr, "Unable to write new chunk\n"); 316 fprintf(stderr, "Unable to write new chunk\n");
245 free(chunkData); 317 free(chunkData);
246 - return 7; 318 + return 11;
247 } 319 }
248 } 320 }
249 321