aboutsummaryrefslogtreecommitdiff
path: root/browser.c
diff options
context:
space:
mode:
Diffstat (limited to 'browser.c')
-rw-r--r--browser.c97
1 files changed, 81 insertions, 16 deletions
diff --git a/browser.c b/browser.c
index fe36782..5e0396f 100644
--- a/browser.c
+++ b/browser.c
@@ -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);
}