diff --git a/tools/fileadder.c b/tools/fileadder.c index e027b54..3462ea0 100644 --- a/tools/fileadder.c +++ b/tools/fileadder.c @@ -16,7 +16,7 @@ // Use a 4MB buffer, the same as the flash rom size #define BUFFER_SIZE 0x400000 -unsigned char buffer[BUFFER_SIZE]; +char buffer[BUFFER_SIZE]; FILE *inptr, *dataptr, *ofile; int outptr; #define PATH_SIZE 1024 @@ -25,8 +25,14 @@ int outptr; char pathbuffer[PATH_SIZE]; char ibuf[INDEX_SIZE]; char dbuf[DEF_SIZE]; +char fbuf[DEF_SIZE]; +char xbuf[DEF_SIZE]; int defbuf_p; int ibuf_p; +int fbuf_p; +int xbuf_p; +bool addsDir = false; +int callNum = 0; const char *argp_program_version = "fileadder 0.1"; const char *argp_program_bug_address = ""; @@ -125,10 +131,55 @@ int addidx(const char *name, int addr, int len) defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "#define FDATA_START_%s 0x%x\n", s, addr); defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "#define FDATA_SIZE_%s %d\n", s, len); - ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, " {\"%s\", FDATA_START_%s, FDATA_SIZE_%s},\n", name, s, s); + ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, " {\"/%s\", FDATA_START_%s, FDATA_SIZE_%s},\n", name, s, s); + if (!strcmp(name, "index.html")) + ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, " {\"/\", FDATA_START_%s, FDATA_SIZE_%s},\n", s, s); return 0; } +/* + * Replaces calls of the type #{function} in .html files being added + * It is assumed that the possibly expanded string will fit into the buffer + * Returns the new length of the string + */ +int replaceCalls(int pos) +{ + int i = 0; + char function_buf[256]; + + while (buffer[pos + i]) { + if ((buffer[pos + i]) == '#' && (buffer[pos + i + 1] == '{')) { + int j = 2; + while (buffer[pos + i + j]) { + if (buffer[pos + i + j] == '}') + break; + function_buf[j - 2] = buffer[pos + i + j]; + j++; + if (j >= 255) { + function_buf[255] = '\0'; + fprintf(stderr, "Function not terminated %s ", function_buf); + exit(5); + } + + } + function_buf[j - 2] = '\0'; + if (!buffer[pos + i + j]) + return i + j; + // Because the buffers overlap we cannot use strcpy + memmove(&buffer[pos + i + 5], &buffer[pos + i + j], strlen(&buffer[pos + i + j]) + 1); + sprintf(&buffer[pos + i + 2], "%03d", callNum); + buffer[pos + i + 5] = '}'; + i += 6; + fbuf_p += snprintf(&fbuf[fbuf_p], DEF_SIZE - fbuf_p, " %s,\n", function_buf); + xbuf_p += snprintf(&xbuf[xbuf_p], DEF_SIZE - xbuf_p, "extern uint16_t %s(void);\n", function_buf); + callNum++; + } + i++; + } + + return strlen(&buffer[pos]); +} + int main(int argc, char **argv) { @@ -180,18 +231,20 @@ int main(int argc, char **argv) } // Add preambles to index and header file - defbuf_p = ibuf_p = 0; + defbuf_p = ibuf_p = xbuf_p = fbuf_p = 0; defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "#ifndef FDATA_DEFS_H\n\n"); defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "#define FDATA_DEFS_H\n\n"); defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "#include \n\n"); - defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "struct f_data {\n char *file;\n uint32_t start;\n uint16_t end;\n};\n\n"); + defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "struct f_data {\n __code char *file;\n uint32_t start;\n uint16_t len;\n};\n\n"); + defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "typedef uint16_t (*fcall_ptr)(void);\n\n"); ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, "// This file is automatically generated, do not edit!\n\n"); if (arguments.prefix) ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, "#include \"%s.h\"\n\n", arguments.prefix); if (arguments.bank) ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, "#pragma codeseg %s\n", arguments.bank); - ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, "struct f_data f_data[] = {\n"); + ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, "__code struct f_data f_data[] = {\n"); + fbuf_p += snprintf(&fbuf[fbuf_p], DEF_SIZE - fbuf_p, "\n__code fcall_ptr f_calls[] = {\n"); // Now that the beginning of the buffer is filled with out image, optionally resize the image if (filesize) @@ -199,6 +252,7 @@ int main(int argc, char **argv) if (stat(arguments.data_file, &s) == 0 && s.st_mode & S_IFDIR) { printf("Adding entries in directory %s\n", arguments.data_file); + addsDir = true; DIR *dirptr = opendir(arguments.data_file); if (!dirptr) { fprintf(stderr, "%s: ", arguments.data_file); @@ -223,6 +277,10 @@ int main(int argc, char **argv) buffer[arguments.address + data_read++ + 1] = '0'; printf("Data inserted from %s at 0x%x, size: %ld\n", pathbuffer, addr, data_read); } + int old_len = data_read; + data_read = replaceCalls(addr); + if (old_len > data_read) + memset(buffer + addr + data_read, 0, old_len - data_read); addidx(in_file->d_name, addr, data_read); addr += data_read; } @@ -236,7 +294,8 @@ int main(int argc, char **argv) } } - ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, "};\n"); + ibuf_p += snprintf(&ibuf[ibuf_p], INDEX_SIZE - ibuf_p, " {0, 0, 0}\n};\n"); + fbuf_p += snprintf(&fbuf[fbuf_p], DEF_SIZE - fbuf_p, "};\n"); defbuf_p += snprintf(&dbuf[defbuf_p], DEF_SIZE - defbuf_p, "#endif\n"); if (filesize) { @@ -280,10 +339,14 @@ int main(int argc, char **argv) return 5; } fputs(ibuf, ofile); + fputs(xbuf, ofile); + fputs(fbuf, ofile); fclose(ofile); - } else { + } else if (addsDir){ puts(dbuf); + puts(xbuf); puts(ibuf); + puts(fbuf); } return 0; }