diff options
| author | Syndamia <kamen@syndamia.com> | 2023-12-08 16:39:59 +0200 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2023-12-08 16:39:59 +0200 |
| commit | f26e610c2f0bdb07fce3f7a100b3ef6159c2ffe7 (patch) | |
| tree | a7b590d71d7e25ddd870eab949e7ce065f80f3db /browser.c | |
| parent | 0382fccd17bdab223166f20541005bf45f113726 (diff) | |
| download | pico-web-f26e610c2f0bdb07fce3f7a100b3ef6159c2ffe7.tar pico-web-f26e610c2f0bdb07fce3f7a100b3ef6159c2ffe7.tar.gz pico-web-f26e610c2f0bdb07fce3f7a100b3ef6159c2ffe7.zip | |
[browser] Implemented anchor parsing and navigation
Diffstat (limited to 'browser.c')
| -rw-r--r-- | browser.c | 97 |
1 files changed, 81 insertions, 16 deletions
@@ -5,13 +5,35 @@ #include <arpa/inet.h> #include <unistd.h> +#include <stdlib.h> #include <stdio.h> #include <string.h> #include <sds/sds.h> +#include <regex.h> #include <util.h> -sds get_page(const int fd_socket) { +int create_socket(const char* ip, const char* port) { + /* + * Create socket for connecting with server + */ + int fd_socket; + herr(fd_socket = socket(AF_INET, SOCK_STREAM, 0), "socket"); + + struct sockaddr_in sa_server = { + .sin_family = AF_INET, + .sin_port = inet_atop(port), + }; + herr(inet_aton(ip, &sa_server.sin_addr.s_addr), "inet_aton"); + + herr(connect(fd_socket, (struct sockaddr*)&sa_server, sizeof(struct sockaddr_in)), "connect"); + + return fd_socket; +} + +sds get_page(const int fd_socket, const char* URL) { + write(fd_socket, URL, strlen(URL)); + sds page = sdsempty(); char buff[512]; @@ -24,30 +46,73 @@ sds get_page(const int fd_socket) { return page; } -void renderPage(const sds page) { - sds toPrint = gsub(page, "\\*[^*]*\\*", "emph"); +struct md_syntax { + regex_t anchor; +}; + +void renderPage(const sds page, const struct md_syntax* syntax, int* *matches, int *matchesCount) { + sds toPrint = sdsdup(page); + + /* Substitute and register anchors */ + toPrint = gsub_getm(toPrint, &syntax->anchor, "\033[4m\1\033[0m\16", matches, matchesCount); + + int anchorInd = 0; + sds newPrint; + for (int i = 0; i < *matchesCount; i++) { + anchorInd = strchr(toPrint, '\16') - toPrint; + + toPrint[anchorInd] = '\0'; + newPrint = sdsgrowzero(sdsempty(), sdslen(toPrint) + digits(i) + 8 + 4); + sprintf(newPrint, "%s\033[30;46m%d\033[0m%s", toPrint, i, toPrint + anchorInd + 1); + + sdsfree(toPrint); + toPrint = newPrint; + } + write(1, toPrint, sdslen(toPrint)); sdsfree(toPrint); } int main(int argc, char* argv[]) { - int fd_socket; - herr(fd_socket = socket(AF_INET, SOCK_STREAM, 0), "socket"); + /* + * Preparation for rendering + */ - struct sockaddr_in sa_server = { - .sin_family = AF_INET, - .sin_port = inet_atop("8080"), + struct md_syntax md = { + .anchor = NULL, }; - herr(inet_aton("127.0.0.1", &sa_server.sin_addr.s_addr), "inet_aton"); + herr(regcomp(&md.anchor, "\\[\\([^]]*\\)\\](\\([^)]*\\))", 0), "regcomp"); - herr(connect(fd_socket, (struct sockaddr*)&sa_server, sizeof(struct sockaddr_in)), "connect"); + /* + * Server-client communication + */ - /* char msg[] = "hello@/test.txt"; */ - write(fd_socket, argv[1], strlen(argv[1])); + sds address = sdsnew(argv[1]); + int count = 0; + sds page; + int* anchorIndecies = NULL; + int anchorCount = 0; - sds page = get_page(fd_socket); - renderPage(page); - sdsfree(page); + int gotoIndex = 0; + int fd_socket; + while (count < 2) { + fd_socket = create_socket("127.0.0.1", "8080"); + page = get_page(fd_socket, address); + free(anchorIndecies); + anchorCount = 0; + renderPage(page, &md, &anchorIndecies, &anchorCount); + + scanf("%d", &gotoIndex); + sdsfree(address); + char* newplace = strchr(page + anchorIndecies[gotoIndex], '(') + 1; + address = sdscatlen(sdsnew(argv[1]), newplace, strchr(newplace, ')') - newplace); + count++; - close(fd_socket); + close(fd_socket); + } + + sdsfree(page); + sdsfree(address); + free(anchorIndecies); + regfree(&md.anchor); } |
