diff --git a/include/devil1pld.h b/include/devil1pld.h index 93a006d..d57bfd7 100644 --- a/include/devil1pld.h +++ b/include/devil1pld.h @@ -17,6 +17,10 @@ struct PldHeader { // * = pass by reference of a struct PldHeader bool getpldh(struct PldHeader*, const char*); +// input: pointer to header, index of offset, filesize +// * = pass by reference of a struct PldHeader +int sizeofpldstruct(struct PldHeader*, unsigned int, unsigned int); + // input: a pld header struct. // * = pass by reference of a struct PldHeader void printpldh(struct PldHeader*); diff --git a/src/devil1pld.c b/src/devil1pld.c index 1f55484..bc0e378 100644 --- a/src/devil1pld.c +++ b/src/devil1pld.c @@ -11,6 +11,24 @@ bool getpldh(struct PldHeader *ph, const char *filedata) { return good; } +// determine the size of the i-th pld structure +int sizeofpldstruct(struct PldHeader *ph, unsigned int i, unsigned int max) { + unsigned int size = -1; + if (ph == NULL) { + fprintf(stderr, "Error: given null pointer\n"); + return size; + } + if (i > ph -> numOffset) { + fprintf(stderr, "Error: i exceeds pldHeader -> numOffset\n"); + return size; + } + unsigned int start = 0, end = 0; + start = ph -> offsets[i]; + end = (i == (ph -> numOffset) - 1) ? max : ph -> offsets[i + 1]; + size = end - start; + return size; +} + void printpldh(struct PldHeader *ph) { if (ph == NULL) { return; diff --git a/test/main.c b/test/main.c index c92f3ba..6617ba4 100644 --- a/test/main.c +++ b/test/main.c @@ -96,7 +96,12 @@ bool unpackpld(const char *filedata, struct PldHeader h; if (filedata != NULL && filesize > 0) { getpldh(&h, filedata); - printpldh(&h); + } + int size = 0; + unsigned int i = 0; + for (i = 0; i < h.numOffset; i++) { + size = sizeofpldstruct(&h, i, filesize); + printf("%x\n", size); } } @@ -152,8 +157,8 @@ int main(int argc, char ** argv) { char *f = argv[1]; unsigned int bufsize = 0; char *buffer = loadfile(f, &bufsize); -// unpackpld(buffer, bufsize, f); - exporttextures(buffer, bufsize, f); + unpackpld(buffer, bufsize, f); +// exporttextures(buffer, bufsize, f); free(buffer); return 0; }