From abdbd16aed11a024d88920b3ad42b62db7e90ddd Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 23 Mar 2009 17:28:19 +0000 Subject: Move makerun into its own directory svn path=/trunk/tools/makerun/; revision=6826 --- makerun.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 makerun.c (limited to 'makerun.c') diff --git a/makerun.c b/makerun.c new file mode 100644 index 0000000..8871b8f --- /dev/null +++ b/makerun.c @@ -0,0 +1,110 @@ +#include +#include + +#ifdef __riscos + #include + #include +#endif + +struct header { + unsigned int decompress; + unsigned int selfreloc; + unsigned int zeroinit; + unsigned int entry; + unsigned int exit; + unsigned int rosize; + unsigned int rwsize; + unsigned int dbsize; + unsigned int zisize; + unsigned int dbtype; + unsigned int base; + unsigned int wkspace; +}; + +int main(int argc, char **argv) +{ + FILE *f, *g; + struct header header; + unsigned int file_size; + char buf[256]; + + if (argc != 4) { + fprintf(stderr, "Usage: %s \n", + argv[0]); + return 1; + } + + f = fopen(argv[1], "rb"); + if (f == NULL) { + fprintf(stderr, "Failed opening %s\n", argv[1]); + return 1; + } + + fread((void*)&header, sizeof(struct header), 1, f); + + fseek(f, 0, SEEK_END); + file_size = ftell(f); + + fclose(f); + + if (header.decompress == 0x464c457f /* FLE\x7f */) { + /* ELF binary */ + file_size += 0x8000; /* Add 32k of scratch space */ + } else { + if ((header.entry >> 24) != 0xEB) { + fprintf(stderr, "%s not binary\n", argv[1]); + return 1; + } + + if (header.rosize + header.rwsize + header.dbsize != + file_size) { + if ((header.decompress >> 24) != 0xEB) { + fprintf(stderr, "Mismatched field sizes\n"); + return 1; + } + } + + file_size = header.rosize + header.rwsize + + header.dbsize + header.zisize + + 0x8000 /* 32k of scratch space */; + } + + f = fopen(argv[2], "r"); + if (f == NULL) { + fprintf(stderr, "Failed opening %s\n", argv[2]); + return 1; + } + + g = fopen(argv[3], "w"); + if (g == NULL) { + fclose(f); + fprintf(stderr, "Failed opening %s\n", argv[3]); + return 1; + } + + while (fgets(buf, sizeof(buf), f) != NULL) { + if (strncmp(buf, "WIMPSLOT\n", 9) == 0) { + fprintf(g, "WimpSlot -min %dk -max %dk\n", + (file_size / 1024), (file_size / 1024)); + } else { + fputs(buf, g); + } + } + + fclose(g); + fclose(f); + +#ifdef __riscos + if (__riscosify(argv[3], 0, __RISCOSIFY_STRICT_UNIX_SPECS | + __RISCOSIFY_NO_SUFFIX | __RISCOSIFY_FILETYPE_NOT_SET, + buf, sizeof(buf), NULL) == NULL) { + fprintf(stderr, "Riscosify failed\n"); + return 1; + } + + osfile_set_type(buf, osfile_TYPE_OBEY); +#endif + + return 0; +} + -- cgit v1.2.3