From 2b1da096a6700e5679c520195654764fd3688cf3 Mon Sep 17 00:00:00 2001 From: thematdev Date: Mon, 3 Jul 2023 16:39:36 +0300 Subject: [PATCH] Now rendering comments --- Makefile | 2 +- src/main.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 85 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index e217791..df1c1e0 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ $(BD)/libcgic.a: cp $(LIBS_DIR)/cgic/libcgic.a $(BD) $(BD)/libqments.a: - $(MAKE) -C $(LIBS_DIR)/qments + $(MAKE) -C $(LIBS_DIR)/qments static cp $(LIBS_DIR)/qments/$(BD)/libqments.a $(BD) $(BD)/$(CGI_EXEC): $(OBJ_FILES) diff --git a/src/main.c b/src/main.c index 9354186..9727661 100644 --- a/src/main.c +++ b/src/main.c @@ -4,12 +4,17 @@ #include "comment.h" #include "cgic.h" #include "driver.h" +#include "drivers/unix_fs/unix_fs_driver.h" #include #define COMMENTS_PER_PAGE 20 #define MAX_NAME 1024 +#define QMENTS_PATH "qments-storage" +#define DRIVER_DATA { QMENTS_PATH } +#define DRIVER unix_fs_driver + void fct_callback(char character, void *arg) { @@ -23,11 +28,13 @@ render_comment(const Comment *comment) char *retval; buffer = &_buffer; - fctprintf(fct_callback, buffer, "
id); + sb_init_empty(buffer); + + fctprintf(fct_callback, buffer, "
\n", comment->id); /* begin header */ fctprintf(fct_callback, buffer, "
\n"); - fctprintf(fct_callback, buffer, "Posted by: %s", comment->header->user_displayname); + fctprintf(fct_callback, buffer, "Posted by: %s\n", comment->header->user_displayname); fctprintf(fct_callback, buffer, "
\n"); /* end header */ @@ -54,29 +61,92 @@ free_header(CommentHeader *header) free(header->user_displayname); } +void +allocate_comment(Comment *comment) +{ + comment->header = malloc(sizeof(CommentHeader)); + allocate_header(comment->header); +} + +void +free_comment(Comment *comment) +{ + free_header(comment->header); + free(comment->header); + free(comment->text); +} + int fetch_comment(int id, Driver *driver, void *driver_data, Comment *comment) { int retval; comment->id = id; - allocate_header(comment->header); + allocate_comment(comment); - retval = driver->get_header(driver_data, comment->header, id) < 0; + retval = driver->get_header(driver_data, comment->header, id); if (retval < 0) { goto defer; } comment->text = malloc(comment->header->text_length + 1); - retval = driver->get_text(driver, comment->text, id); + retval = driver->get_text(driver_data, comment->text, id); defer: if (retval < 0) { - free_header(comment->header); - free(comment->text); + free_comment(comment); } return retval; } +/* each page stores comments with ids in [P * (page - 1), P * page) + * if page is not specified, then we'll just print last P comments (for now) + * TODO: print errors in div + */ +void +print_page() +{ + int page, max_id; + int id_begin, id_end, i; + Comment comment; + UnixFsDriverData driver_data = DRIVER_DATA; + Driver driver = DRIVER; + + cgiFormInteger("page", &page, 0); + if ((max_id = unix_fs_driver_get_max_id(&driver_data)) < 0) { + fprintf(cgiOut, "Error fetching comments\n"); + return; + } + + if (page <= 0) { + id_end = max_id; + id_begin = (max_id > COMMENTS_PER_PAGE ? max_id - COMMENTS_PER_PAGE : 1); + } else { + /* max_id >= COMMENTS_PER_PAGE * page + * perform this check without overflow + */ + if (max_id / page < COMMENTS_PER_PAGE) { + fprintf(cgiOut, "There is no such page\n"); + return; + } + id_begin = COMMENTS_PER_PAGE * (page - 1); + id_end = id_begin + COMMENTS_PER_PAGE; + if (id_end > max_id) { + id_end = max_id; + } + } + + for (i = id_begin; i != id_end; ++i) { + if (fetch_comment(i, &driver, &driver_data, &comment) < 0) { + fprintf(cgiOut, "Failed to fetch comment %d\n", i); + } else { + char *rendered_comment = render_comment(&comment); + fputs(rendered_comment, cgiOut); + free(rendered_comment); + free_comment(&comment); + } + } +} + int cgiMain() { @@ -89,7 +159,13 @@ cgiMain() fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); - fprintf(cgiOut, + + /* print_submit_form(); */ + + fprintf(cgiOut, "
\n"); + print_page(); + fprintf(cgiOut, "
\n"); + fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n");