aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInqiyad Sabr <sabr@ariamath.xyz>2025-11-03 00:08:18 +0600
committerInqiyad Sabr <sabr@ariamath.xyz>2025-11-03 00:08:18 +0600
commitd83a53beb823f9e1cbd73ea214fe99a1511f5f59 (patch)
treea4457637888f685bc998b00432ba06b53e013583
parent06d4267caa0060989019cc08a7de4b1b65981000 (diff)
Code Cleanup, More strict checks
The previous write up was a disaster but it works, not very strict, it skips some edge cases for performance. Your gemini capsule might be large and stuff. But I decided to opt for code readability over performance for now. Going to work on optimisations later.
-rw-r--r--g2x.c118
1 files changed, 63 insertions, 55 deletions
diff --git a/g2x.c b/g2x.c
index f53fff0..d2d7cef 100644
--- a/g2x.c
+++ b/g2x.c
@@ -1,68 +1,76 @@
#include <stdio.h>
+#include <string.h>
+
#define BUFSIZE 4096
#define xmlput(n)\
- for(i = n; buf[i] != '\n'; i++) {\
- switch(buf[i]) {\
- default: putchar(buf[i]); break;\
+ for(pos = n; buf[pos] != '\n'; pos++) {\
+ switch(buf[pos]) {\
+ default: putchar(buf[pos]); break;\
case '>' : fputs("&gt;",stdout); break;\
case '<' : fputs("&lt;",stdout); break;\
case '&' : fputs("&amp;",stdout); break;\
case '\'': fputs("&apos;",stdout); break;\
- case '"' : fputs("&quot;",stdout); break;}}
-int main(void) {
- char buf[BUFSIZE]; int i;
- fputs(
+ case '"' : fputs("&quot;",stdout); break;\
+ }\
+ }
+#define html(s) fputs(s,stdout)
+#define getbuf() fgets(buf,BUFSIZE,stdin)
+
+int main(void)
+{
+ char buf[BUFSIZE];
+ int pos, list_state = 0;
+
+ html(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- "<!DOCTYPE html PUBLIC ""\"-//W3C//DTD XHTML "
- "1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/"
- "DTD/xhtml1-strict.dtd\">\n"
- "<html xmlns=\"http://www.w3.org/1999/xhtml\" "
- "xml:lang=\"en\" lang=\"en\">\n<head>\n"
- "<meta name=\"viewport\" "
- "content=\"width=device-width, "
- "initial-scale=1\" />\n"
- "<link rel=\"stylesheet\" "
- "type=\"text/css\" href=\"/style.css\" />\n"
- "<title></title></head><body>",stdout
- ); while (fgets(buf,BUFSIZE,stdin) != NULL) {
- if (buf[2] == '#')/* ### */ {
- fputs("<h3>",stdout);
- xmlput(4); fputs("</h3>\n",stdout);
- continue;
- } else if (buf[1] == '#') /* ## */ {
- fputs("<h2>",stdout);
- xmlput(3); fputs("</h2>\n",stdout);
- continue;
- } else if (buf[0] == '#') /* # */ {
- fputs("<h1>",stdout);
- xmlput(2); fputs("</h1>\n",stdout);
+ "<!DOCTYPE html PUBLIC ""\"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"
+ "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n"
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"/>\n"
+ "<title></title></head><body>\n"
+ );
+
+ while (getbuf() != NULL)
+ {
+ if (!strncmp(buf,"###",3)) {
+ html("<h3>"); xmlput(4); html("</h3>"); continue;
+ } else if (!strncmp(buf,"##",2)) {
+ html("<h2>"); xmlput(3); html("</h3>"); continue;
+ } else if (buf[0] == '#') {
+ html("<h1>"); xmlput(2); html("</h1>"); continue;
+ }
+ else if (buf[0] == '>') {
+ fputs("<blockquote>",stdout); xmlput(2);
+ fputs("</blockquote>\n",stdout); continue;
+ }
+ else if (buf[0] == '*') {
+ if (list_state == 0) html("<ul>\n");
+ html("<li>"); xmlput(2); html("</li>\n");
+ list_state = 1;
continue;
- } else if (buf[0] == '*') {
- fputs("<ul><li>",stdout); xmlput(2);
- fputs("</li></ul>\n",stdout); continue;
- } else if (buf[0] == '=' && buf[1] == '>')/* link */ {
- fputs("<p><a href=\"",stdout);
- for (i = 3; buf[i] != '.' && buf[i] != ' '; i++)
- putchar(buf[i]);
- if (buf[i+1] == 'g') {fputs(".html",stdout);i=i+3;}
- else {for (;buf[i] != ' '; i++) putchar(buf[i]);}
- fputs("\">",stdout); xmlput(i+1);
- fputs("</a></p>\n",stdout);
+ } else if (list_state == 1) {
+ html("</ul>\n");
+ list_state = 0;
continue;
- } else if (buf[0] == '`' && buf[2] == '`')/* code */ {
- fputs("<pre><code>",stdout);
- fgets(buf,BUFSIZE,stdin);
- while (buf[0] != '`' && buf[2] != '`') {
- xmlput(0); fputs("\n",stdout);
- fgets(buf,BUFSIZE,stdin);
- } fputs("</code></pre>",stdout);
+ }
+ else if (!strncmp(buf,"=>",2)) {
+ html("<p><a href=\"");
+ for (pos = 3; buf[pos] != '.' && buf[pos] != ' ';)
+ putchar(buf[pos++]);
+ if (buf[pos] == '.') {
+ int i = 0; char suffix[4];
+ while ((suffix[i++] = buf[pos++]) != ' ');
+ if (!strncmp(suffix,".gmi",4)) html(".html");
+ else html(suffix);
+ } html("\">"); xmlput(pos); html("</a></p>\n");
continue;
- } else if (buf[0] == '>') {
- fputs("<blockquote>",stdout); xmlput(2);
- fputs("</blockquote>\n",stdout);
+ }
+ else if (!strncmp(buf,"```",3)) {
+ getbuf(); html("<pre><code>");
+ while (strncmp(buf,"```",3)) {
+ xmlput(0); putchar('\n'); getbuf();
+ } html("</code></pre>\n");
continue;
- } fputs("<p>",stdout);
- xmlput(0); fputs("</p>\n",stdout);
- } fputs("</body>",stdout);
- fputs("</html>",stdout);
+ } html("<p>"); xmlput(0); html("</p>\n");
+ } html("</body>"); html("</html>");
}