diff options
| author | Inqiyad Sabr <sabr@ariamath.xyz> | 2025-11-03 00:08:18 +0600 |
|---|---|---|
| committer | Inqiyad Sabr <sabr@ariamath.xyz> | 2025-11-03 00:08:18 +0600 |
| commit | d83a53beb823f9e1cbd73ea214fe99a1511f5f59 (patch) | |
| tree | a4457637888f685bc998b00432ba06b53e013583 /g2x.c | |
| parent | 06d4267caa0060989019cc08a7de4b1b65981000 (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.
Diffstat (limited to 'g2x.c')
| -rw-r--r-- | g2x.c | 118 |
1 files changed, 63 insertions, 55 deletions
@@ -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(">",stdout); break;\ case '<' : fputs("<",stdout); break;\ case '&' : fputs("&",stdout); break;\ case '\'': fputs("'",stdout); break;\ - case '"' : fputs(""",stdout); break;}} -int main(void) { - char buf[BUFSIZE]; int i; - fputs( + case '"' : fputs(""",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>"); } |