From 4c73f89184246244dace0c405894cc10fc53b854 Mon Sep 17 00:00:00 2001 From: _N3m0 Date: Sat, 30 Dec 2023 23:26:35 +0100 Subject: [PATCH] fragmentation + refactor page in struct --- .gitignore | 1 + Makefile | 9 +++--- config.c | 20 ++++++++++++ config.h | 16 ++++++++++ main.c | 91 ++---------------------------------------------------- page.c | 61 ++++++++++++++++++++++++++++++++++++ page.h | 25 +++++++++++++++ 7 files changed, 130 insertions(+), 93 deletions(-) create mode 100644 config.c create mode 100644 config.h create mode 100644 page.c create mode 100644 page.h diff --git a/.gitignore b/.gitignore index 8dbfcb7..71246d5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ out test.sh test.c a.out +*.o diff --git a/Makefile b/Makefile index 484deed..b0e912a 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,18 @@ -SRC=main.c BIN=webpage +SRCS=main.c config.c page.c +INC=. LIB=curl FLAGS=-Wall -Wextra -Og -g all: $(BIN) -$(BIN) : $(SRC) - gcc $(FLAGS) -o $(BIN) $(SRC) -l$(LIB) +$(BIN) : $(SRCS) + gcc $(FLAGS) -o $(BIN) $(SRCS) -I$(INC) -l$(LIB) run : $(BIN) ./$(BIN) $(input) clean : - rm $(BIN) + rm -f $(BIN) *.o .PHONY : run clean diff --git a/config.c b/config.c new file mode 100644 index 0000000..4b05d5d --- /dev/null +++ b/config.c @@ -0,0 +1,20 @@ +#include "config.h" + +UserConfig config = { + .port = 443, + .addr = "https://github.com/CaptainBoulbi/webpage", +}; + +void getUserConfig(int argc, char* argv[]){ + for (int i=1; i +#include +#include + +typedef struct UserConfig { + int port; + char* addr; +} UserConfig; + +extern UserConfig config; + +void getUserConfig(int argc, char* argv[]); + +#endif // CONFIG_H diff --git a/main.c b/main.c index 3937e3c..66bd484 100644 --- a/main.c +++ b/main.c @@ -1,92 +1,5 @@ -#include -#include -#include -#include -#include -#include - -#define DEFAULT_PAGE_LEN 16 - -int pageChunkLen = DEFAULT_PAGE_LEN; -int nbchunck = 0; -char** pageChunk; - -typedef struct UserConfig { - int port; - char* addr; -} UserConfig; - -UserConfig config = { - .port = 443, - .addr = "https://github.com/CaptainBoulbi/webpage", -}; - -void getUserConfig(int argc, char* argv[]){ - for (int i=1; i= pageChunkLen){ - pageChunkLen *= 1.5; - pageChunk = realloc(pageChunk, sizeof(*pageChunk) * pageChunkLen); - - if (pageChunk == NULL){ - perror("ERROR: Buy more ram.\n"); - exit(1); - } - - memset(&pageChunk[nbchunck], 0, pageChunkLen - nbchunck); - } - - pageChunk[nbchunck] = malloc(bytes+1); - pageChunk[nbchunck][bytes] = '\0'; - strncpy(pageChunk[nbchunck], buffer, bytes); - nbchunck++; - - return bytes; -} - -void getPage(void){ - pageChunk = malloc(sizeof(*pageChunk) * DEFAULT_PAGE_LEN); - if (pageChunk == NULL){ - perror("ERROR: Buy more ram.\n"); - exit(1); - } - - CURL* curl = curl_easy_init(); - if (curl == NULL){ - perror("ERROR: curl init failed.\n"); - exit(1); - } - - curl_easy_setopt(curl, CURLOPT_URL, config.addr); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, save_chunk); - - CURLcode result = curl_easy_perform(curl); - if (result != CURLE_OK){ - fprintf(stderr, "CURL ERROR: %s\n", curl_easy_strerror(result)); - } - - curl_easy_cleanup(curl); -} - -void printPage(void){ - for (int i=0; i= page.cap){ + page.cap *= 1.5; + page.chunks = realloc(page.chunks, sizeof(*page.chunks) * page.cap); + + if (page.chunks == NULL){ + perror("ERROR: Buy more ram.\n"); + exit(1); + } + + memset(&page.chunks[page.len], 0, page.cap - page.len); + } + + page.chunks[page.len] = malloc(bytes+1); + page.chunks[page.len][bytes] = '\0'; + strncpy(page.chunks[page.len], buffer, bytes); + page.len++; + + return bytes; +} + +void getPage(void){ + page.chunks = malloc(sizeof(*page.chunks) * DEFAULT_PAGE_LEN); + if (page.chunks == NULL){ + perror("ERROR: Buy more ram.\n"); + exit(1); + } + + CURL* curl = curl_easy_init(); + if (curl == NULL){ + perror("ERROR: curl init failed.\n"); + exit(1); + } + + curl_easy_setopt(curl, CURLOPT_URL, config.addr); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, save_chunk); + + CURLcode result = curl_easy_perform(curl); + if (result != CURLE_OK){ + fprintf(stderr, "CURL ERROR: %s\n", curl_easy_strerror(result)); + } + + curl_easy_cleanup(curl); +} + +void printPage(void){ + for (int i=0; i +#include +#include + + +#define DEFAULT_PAGE_LEN 16 + +typedef struct PageHTML { + char** chunks; + int cap; + int len; +} PageHTML; + +extern PageHTML page; + +size_t save_chunk(char* buffer, size_t itemsize, size_t nitems, void* ignore); + +void getPage(void); + +void printPage(void); + +#endif // PAGE_H