From 8a9637d941a03535039719b16130bc4ad1989ed1 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 5 Sep 2024 16:12:50 +0900 Subject: [PATCH] Add "output" size parameter to http_template fn --- src/http_template.c | 14 ++++++++++++-- src/http_template.h | 8 +++++++- src/test.c | 14 ++++++++++---- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/http_template.c b/src/http_template.c index 5b6e21d..012ed7a 100644 --- a/src/http_template.c +++ b/src/http_template.c @@ -98,7 +98,11 @@ int c_simple_http_internal_ends_with_FILE(const char *c_string) { char *c_simple_http_path_to_generated( const char *path, - const C_SIMPLE_HTTP_HTTPTemplates *templates) { + const C_SIMPLE_HTTP_HTTPTemplates *templates, + size_t *output_buf_size) { + if (output_buf_size) { + *output_buf_size = 0; + } C_SIMPLE_HTTP_ParsedConfig *wrapped_hash_map = simple_archiver_hash_map_get(templates->hash_map, path, strlen(path) + 1); if (!wrapped_hash_map) { @@ -157,7 +161,7 @@ char *c_simple_http_path_to_generated( size_t delimeter_count = 0; // xxxx xxx0 - Initial state, no delimeter reached. - // xxxx xxx1 - Three "{" delimeters reached. + // xxxx xxx1 - Three left-curly-brace delimeters reached. unsigned int state = 0; for (; idx < html_buf_size; ++idx) { @@ -321,11 +325,17 @@ char *c_simple_http_path_to_generated( return NULL; } to_fill.html[final_size] = 0; + if (output_buf_size) { + *output_buf_size = final_size; + } return to_fill.html; } else { // Prevent cleanup fn from "free"ing html_buf and return it verbatim. char *buf = html_buf; html_buf = NULL; + if (output_buf_size) { + *output_buf_size = html_buf_size; + } return buf; } } diff --git a/src/http_template.h b/src/http_template.h index a6c4391..e7a9da9 100644 --- a/src/http_template.h +++ b/src/http_template.h @@ -19,11 +19,17 @@ #include "http.h" +// Standard library includes. +#include + // Returns non-NULL on success, which must be free'd after use. // Takes a path string and templates and returns the generated HTML. +// If "output_buf_size" is non-NULL, it will be set to the size of the returned +// buffer. char *c_simple_http_path_to_generated( const char *path, - const C_SIMPLE_HTTP_HTTPTemplates *templates); + const C_SIMPLE_HTTP_HTTPTemplates *templates, + size_t *output_buf_size); #endif diff --git a/src/test.c b/src/test.c index 3adba4f..fb2cb0d 100644 --- a/src/test.c +++ b/src/test.c @@ -248,10 +248,13 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); + size_t output_buf_size; + __attribute__((cleanup(simple_archiver_helper_cleanup_c_string))) - char *buf = c_simple_http_path_to_generated("/", &config); + char *buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); ASSERT_TRUE(buf != NULL); ASSERT_TRUE(strcmp(buf, "

Test

") == 0); + CHECK_TRUE(output_buf_size == 14); simple_archiver_helper_cleanup_c_string(&buf); __attribute__((cleanup(test_internal_cleanup_delete_temporary_file))) @@ -283,7 +286,7 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); - buf = c_simple_http_path_to_generated("/", &config); + buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); ASSERT_TRUE(buf != NULL); printf("%s\n", buf); ASSERT_TRUE( @@ -291,6 +294,7 @@ int main(void) { buf, "

Some text.


More text.

") == 0); + CHECK_TRUE(output_buf_size == 47); simple_archiver_helper_cleanup_c_string(&buf); __attribute__((cleanup(test_internal_cleanup_delete_temporary_file))) @@ -345,7 +349,7 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); - buf = c_simple_http_path_to_generated("/", &config); + buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); ASSERT_TRUE(buf != NULL); printf("%s\n", buf); ASSERT_TRUE( @@ -353,6 +357,7 @@ int main(void) { buf, "

testVar text.


testVar2 text.

") == 0); + CHECK_TRUE(output_buf_size == 53); simple_archiver_helper_cleanup_c_string(&buf); __attribute__((cleanup(test_internal_cleanup_delete_temporary_file))) @@ -427,7 +432,7 @@ int main(void) { ); ASSERT_TRUE(config.paths != NULL); - buf = c_simple_http_path_to_generated("/", &config); + buf = c_simple_http_path_to_generated("/", &config, &output_buf_size); ASSERT_TRUE(buf != NULL); printf("%s\n", buf); ASSERT_TRUE( @@ -435,6 +440,7 @@ int main(void) { buf, "

some test text in test var file.

") == 0); + CHECK_TRUE(output_buf_size == 43); simple_archiver_helper_cleanup_c_string(&buf); }