diff --git a/calathea.c b/calathea.c index be98934..a8e0cf4 100644 --- a/calathea.c +++ b/calathea.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -133,6 +134,32 @@ void page_list_free(struct PageList *list) { } /*** Templating ***/ +char * concat_strings(int n, ...) { + va_list list; + va_start(list, n); + + int length = 0; + char **strings = malloc(n * sizeof(char *)); + memset(strings, 0, n * sizeof(char *)); + + for (int i = 0; i < n; i++) { + strings[i] = va_arg(list, char *); + length += strlen(strings[i]); + } + + char * joinedString = malloc((length + 1) * sizeof(char *)); + memset(joinedString, 0, (length + 1) * sizeof(char *)); + + strcpy(joinedString, strings[0]); + for (int i = 1; i < n; i++) { + strcat(joinedString, strings[i]); + } + + free(strings); + va_end(list); + return joinedString; +} + char * substitute_string(char dest[], char sub[], char *start, char *end) { int startIndex = start - dest; @@ -242,22 +269,14 @@ int main(int argc, char *argv[]) { currentPage->incoming = page_list(initialInboundCapacity); // Build the page's permalink - currentPage->permalink = malloc(strlen(fileBasename) + 6); - - strcpy(currentPage->permalink, fileBasename); - strcat(currentPage->permalink, ".html"); + currentPage->permalink = concat_strings(2, fileBasename, ".html"); // Construct the relative path // The two accounts for the slash and the terminal zero - char relativePath[strlen(pagesLocation) + filenameLength + 2]; - memset(relativePath, 0, strlen(pagesLocation) + filenameLength + 2); - - strcpy(relativePath, pagesLocation); - strcat(relativePath, "/"); - strcat(relativePath,fileEntry->d_name); - relativePath[strlen(pagesLocation) + filenameLength + 1] = 0; + char *relativePath = concat_strings(3, pagesLocation, "/", fileEntry->d_name); char *buffer = read_file(relativePath); + free(relativePath); if (buffer == NULL) { fileEntry = readdir(pagesDir); @@ -310,15 +329,8 @@ int main(int argc, char *argv[]) { } // Create the directory if it doesn't exist - char *createOutputDir = malloc( - (7 + strlen(outputDirectoryName)) * sizeof(char) - ); - - strcpy(createOutputDir, "mkdir \0"); - strcat(createOutputDir, outputDirectoryName); - + char *createOutputDir = concat_strings(2, "mkdir ", outputDirectoryName); system(createOutputDir); - free(createOutputDir); /*** Link Processing ***/ @@ -346,22 +358,18 @@ int main(int argc, char *argv[]) { struct Page *linkedPage = map_get(pageMap, mapSize, title); - char *compiledLink; + char *compiledLink = NULL; if (linkedPage == NULL) { // i.e. the page does not exist - compiledLink = malloc(strlen(title) + 38); - strcpy(compiledLink, ""); - strcat(compiledLink, title); - strcat(compiledLink, "\0"); + compiledLink = concat_strings(3, + "", + title, + "" + ); } else { page_list_insert(linkedPage->incoming, currentPage); - compiledLink = malloc(strlen(title) + strlen(linkedPage->permalink) + 5); - strcpy(compiledLink, "["); - strcat(compiledLink, title); - strcat(compiledLink, "]("); - strcat(compiledLink, linkedPage->permalink); - strcat(compiledLink, ")\0"); + compiledLink = concat_strings(5, "[", title, "](", linkedPage->permalink, ")"); } char *newContent = substitute_string( @@ -421,11 +429,15 @@ int main(int argc, char *argv[]) { strcpy(incomingLinksList, "\n"); @@ -441,13 +453,8 @@ int main(int argc, char *argv[]) { } // Output the page to the file - char *outputFileName = malloc( - (strlen(outputDirectoryName) - + strlen(currentPage->permalink) - + 2)); - strcpy(outputFileName, outputDirectoryName); - strcat(outputFileName, "/\0"); - strcat(outputFileName, currentPage->permalink); + char *outputFileName = concat_strings(3, + outputDirectoryName, "/", currentPage->permalink); FILE *outputFile = fopen(outputFileName, "w");