diff --git a/Makefile b/Makefile index 9b23f01..4fc259c 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,8 @@ filec: src/file-to-c/main.o $(PAGES_DIR)/index.chtml: $(PAGES_DIR)/index.html ./filec $< data_index_html > $@ +$(PAGES_DIR)/status.chtml: $(PAGES_DIR)/status.html + ./filec $< data_status_html > $@ $(MASTODONT_DIR): git clone $(MASTODONT_URL) || true diff --git a/dist/ratfe.css b/dist/ratfe.css index 9619c63..f182515 100644 --- a/dist/ratfe.css +++ b/dist/ratfe.css @@ -8,7 +8,6 @@ body { display: flex; justify-content: center; - } #display @@ -69,7 +68,7 @@ div#content main div#content aside { width: 180px; - max-width: 200px; + min-width: 180bpx; background-color: #fcfcfc; } diff --git a/src/easprintf.c b/src/easprintf.c index d7dcc94..1999d61 100644 --- a/src/easprintf.c +++ b/src/easprintf.c @@ -16,14 +16,36 @@ * along with this program. If not, see . */ +#include +#include #include "easprintf.h" int evasprintf(char** ret, const char* format, va_list ap) { + va_list ap_copy; + va_copy(ap_copy, ap); + int sz = vsnprintf(NULL, 0, format, ap); + va_end(ap); + + *ret = malloc(sz + 1); + if(*ret == NULL) + { + perror("malloc"); + *ret = NULL; + va_end(ap_copy); + return -1; + } + + vsnprintf(*ret, sz + 1, format, ap_copy); + + va_end(ap_copy); + return sz; } int easprintf(char** ret, const char* format, ...) { - + va_list ap; + va_start(ap, format); + return evasprintf(ret, format, ap); } diff --git a/src/easprintf.h b/src/easprintf.h index 5c6de6c..9ce6b64 100644 --- a/src/easprintf.h +++ b/src/easprintf.h @@ -18,7 +18,9 @@ #ifndef EASPRINTF_H #define EASPRINTF_H +#include +/* Alternatives to asprintf functions, which are glibc-only/bsd functions */ int evasprintf(char** ret, const char* format, va_list ap); int easprintf(char** ret, const char* format, ...); diff --git a/src/file-to-c/main.c b/src/file-to-c/main.c index faf2ecd..ef9d274 100644 --- a/src/file-to-c/main.c +++ b/src/file-to-c/main.c @@ -59,6 +59,7 @@ int main(int argc, char** argv) printf("#ifndef __%s\n", argv[ARG_VARIABLE]); printf("#define __%s\n", argv[ARG_VARIABLE]); + printf("static size_t %s_size = %ld;", argv[ARG_VARIABLE], size); printf("static const char %s[] = {", argv[ARG_VARIABLE]); for (size_t i = 0; i < size; ++i) { diff --git a/src/index.c b/src/index.c index c44743e..df6ad96 100644 --- a/src/index.c +++ b/src/index.c @@ -16,17 +16,35 @@ * along with this program. If not, see . */ +#include #include #include "../config.h" #include "index.h" +#include "easprintf.h" +#include "status.h" // Files #include "../static/index.chtml" void content_index(mastodont_t* api) { + size_t status_count, statuses_html_count; struct mstdnt_status* statuses; struct mstdnt_storage storage; - mastodont_timeline_public(api, NULL, &storage, &statuses); - printf(data_index_html, config_canonical_name); + char* status_format; + mastodont_timeline_public(api, NULL, &storage, &statuses, &status_count); + + /* Calculate statuses */ + status_format = construct_statuses(statuses, status_count, &statuses_html_count); + if (status_format == NULL) + status_format = "Error in malloc! Something has gone terribly wrong..."; + + /* Output */ + printf("Content-Length: %ld\r\n\r\n", + data_index_html_size + statuses_html_count + 4); + printf(data_index_html, config_canonical_name, status_format); + + /* Cleanup */ + mastodont_storage_cleanup(&storage); + free(status_format); } diff --git a/src/main.c b/src/main.c index e12fce8..7cedf79 100644 --- a/src/main.c +++ b/src/main.c @@ -27,7 +27,7 @@ int main() { char* path = getenv("PATH_INFO"); // Content type is always HTML - fputs("Content-type: text/html\r\n\r\n", stdout); + fputs("Content-type: text/html\r\n", stdout); // Global init mastodont_global_curl_init(); diff --git a/src/status.c b/src/status.c new file mode 100644 index 0000000..db179b3 --- /dev/null +++ b/src/status.c @@ -0,0 +1,65 @@ +/* + * RatFE - Lightweight frontend for Pleroma + * Copyright (C) 2022 Nekobit + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include "status.h" +#include "easprintf.h" +#include "../static/status.chtml" + +char* construct_statuses(struct mstdnt_status* statuses, size_t size, size_t* ret_size) +{ + char* stat_html, *result = NULL; + int curr_parse_size = 0, last_parse_size, parse_size; + + for (size_t i = 0; i < size; ++i) + { + parse_size = easprintf(&stat_html, data_status_html, + statuses[i].id, /* Username */ + "@who?", /* Account */ + "Public?", /* visibility */ + statuses[i].content); + if (parse_size == -1) /* Malloc error */ + { + if (result) free(result); + return NULL; + } + last_parse_size = curr_parse_size; + curr_parse_size += parse_size; + + result = realloc(result, curr_parse_size + 1); + if (result == NULL) + { + perror("malloc"); + free(stat_html); + return NULL; + } + + /* Copy stat_html to result in correct position */ + strncpy(result + last_parse_size, stat_html, parse_size); + /* Cleanup */ + free(stat_html); + } + + result[curr_parse_size] = '\0'; + + if (ret_size) *ret_size = curr_parse_size; + + return result; +} + diff --git a/src/status.h b/src/status.h new file mode 100644 index 0000000..2c595f1 --- /dev/null +++ b/src/status.h @@ -0,0 +1,25 @@ +/* + * RatFE - Lightweight frontend for Pleroma + * Copyright (C) 2022 Nekobit + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef STATUS_H +#define STATUS_H +#include + +char* construct_statuses(struct mstdnt_status* statuses, size_t size, size_t* ret_size); + +#endif // STATUS_H diff --git a/static/index.html b/static/index.html index 8172c03..1c5e908 100644 --- a/static/index.html +++ b/static/index.html @@ -27,24 +27,8 @@
-
-
- -
-
-
- Rat user - @ratlord@cum.desupost.soy - - public - -
- - This is my first post

- Just landed in L.A.! -
-
-
+ %s +
diff --git a/static/status.html b/static/status.html new file mode 100644 index 0000000..651e065 --- /dev/null +++ b/static/status.html @@ -0,0 +1,17 @@ +
+
+ +
+
+
+ %s + %s + + %s + +
+ + %s + +
+