From ac4a07e9d425258b120c99af6147c654bc18eb3a Mon Sep 17 00:00:00 2001
From: Emil <emilwilliams@tuta.io>
Date: Wed, 20 Sep 2023 23:49:36 +0000
Subject: [PATCH] Improved main.c and syntax for the sake of the future
 children of the world Removed division from get_stdin, and made it fail
 properly on failed allocation Fixed the retard brain #include syntax/c.h shit
 (god I hope I didn't break highlightlighting I'm not - I checked and it
 outputs the same under the last commit, it's probably fine anon'll fix it
 what a cuck) Much better input handling, properly using perror and handling
 multible files even under a noexist condition, probably fixed a seggy on
 noexist condition

---
 include/syntax/c.h      | 46 ++++++++++++-----------
 include/syntax/syntax.h |  6 +++
 source/main.c           | 81 ++++++++++++++++-------------------------
 3 files changed, 62 insertions(+), 71 deletions(-)
 create mode 100644 include/syntax/syntax.h

diff --git a/include/syntax/c.h b/include/syntax/c.h
index dffb5a9..9624072 100644
--- a/include/syntax/c.h
+++ b/include/syntax/c.h
@@ -1,23 +1,27 @@
-const char * c_keywords[] = {
-  "register",     "volatile",     "auto",         "const",        "static",       "extern",       "if",           "else",
-  "do",           "while",        "for",          "continue",     "switch",       "case",         "default",      "break",
-  "enum",         "union",        "struct",       "typedef",      "goto",         "void",         "return",       "sizeof",
-  "char",         "short",        "int",          "long",         "signed",       "unsigned",     "float",        "double",
-  NULL
-};
+void
+highlight_c(void)
+{
+  const char * c_keywords[] =  {
+    "register",     "volatile",     "auto",         "const",        "static",       "extern",       "if",           "else",
+    "do",           "while",        "for",          "continue",     "switch",       "case",         "default",      "break",
+    "enum",         "union",        "struct",       "typedef",      "goto",         "void",         "return",       "sizeof",
+    "char",         "short",        "int",          "long",         "signed",       "unsigned",     "float",        "double",
+    NULL
+  };
 
-const char * preprocessor_keywords[] = {
-  "#include",     "#pragma",      "#define",      "#undef",       "#ifdef",       "#ifndef",      "#elifdef",     "#elifndef",
-  "#if",          "#elif",        "#else",        "#endif",       "#embed",       "#line",        "#error",       "#warning",
-  NULL
-};
+  const char * preprocessor_keywords[] = {
+    "#include",     "#pragma",      "#define",      "#undef",       "#ifdef",       "#ifndef",      "#elifdef",     "#elifndef",
+    "#if",          "#elif",        "#else",        "#endif",       "#embed",       "#line",        "#error",       "#warning",
+    NULL
+  };
 
-new_char_tokens("+-&|.()[]{}", operator_hl);
-new_keyword_tokens(c_keywords, control_hl);
-new_keyword_tokens(preprocessor_keywords, special_hl);
-new_region_token("/\\*", "\\*/", comment_hl);
-new_region_token("//", "\\n", comment_hl);
-new_region_token("\"", "\"", string_literal_hl);
-new_region_token("<", ">", string_literal_hl);
-new_keyword_token("keyword", special_hl);
-new_keyword_token("while", operator_hl);
+  new_char_tokens("+-&|.()[]{}", operator_hl);
+  new_keyword_tokens(c_keywords, control_hl);
+  new_keyword_tokens(preprocessor_keywords, special_hl);
+  new_region_token("/\\*", "\\*/", comment_hl);
+  new_region_token("//", "\\n", comment_hl);
+  new_region_token("\"", "\"", string_literal_hl);
+  new_region_token("<", ">", string_literal_hl);
+  new_keyword_token("keyword", special_hl);
+  new_keyword_token("while", operator_hl);
+}
diff --git a/include/syntax/syntax.h b/include/syntax/syntax.h
new file mode 100644
index 0000000..b19ca37
--- /dev/null
+++ b/include/syntax/syntax.h
@@ -0,0 +1,6 @@
+#ifndef SYNTAX_H_
+
+#include "c.h"
+
+#define SYNTAX_H_
+#endif
diff --git a/source/main.c b/source/main.c
index 9f51c64..b21d9d9 100644
--- a/source/main.c
+++ b/source/main.c
@@ -9,13 +9,14 @@
 #include <fcntl.h>
 
 #include "terminal.h"
+#include "syntax/syntax.h"
 
 #define ALLOCATION_CHUNK (128UL)
 
 static const char * argv0;
 
 static char *
-slurp(const char * fn)
+read_entire_file(const char * fn)
 {
 	FILE * fp = fopen(fn, "r");
 	if (fp)
@@ -26,8 +27,7 @@ slurp(const char * fn)
 		len = ftell(fp);
 		rewind(fp);
 		b = malloc(len + 1);
-		if (b && fread(b, 1, len, fp))
-		{
+		if (b && fread(b, 1, len, fp)) {
 			b[len] = '\0';
 		}
 		fclose(fp);
@@ -41,88 +41,69 @@ static char *
 get_stdin(void)
 {
 	size_t buffer_size = 0;
+	size_t n = 1;
 	char * buffer = malloc(ALLOCATION_CHUNK);
+	if (!buffer)
+	{ return NULL; }
 	do {
-		if (!((buffer_size + 1) % ALLOCATION_CHUNK)) {
-			buffer = realloc(buffer, (((buffer_size + 1) / ALLOCATION_CHUNK) + 1) * ALLOCATION_CHUNK);
+		if (buffer_size + 1 >= (ALLOCATION_CHUNK * n)) {
+			buffer = realloc(buffer, ALLOCATION_CHUNK * ++n + 1);
+			if (!buffer)
+			{ return NULL; }
+			buffer[ALLOCATION_CHUNK * n] = '\0';
 		}
-		buffer[buffer_size] = '\0';
 		if (read(STDIN_FILENO, &buffer[buffer_size], sizeof (*buffer)) == -1)
 		{
 			free(buffer);
-			fprintf(stderr, "%s: Failed to read from STDIN\n", argv0);
+			fprintf(stderr, "%s: Failed to read from stdin\n", argv0);
 			return NULL;
 		}
-		++buffer_size;
-	} while (buffer[buffer_size - 1]);
+	} while (buffer[buffer_size++]);
 
 	buffer[buffer_size - 1] = '\0';
 	return buffer;
 }
 
-/* TODO: fix the shit going on with syntax/c.h , replace with a function,
- * and ideally how make it hotswappable. */
 int
 main(int     argc,
      char ** argv) {
 	int    arg    = 0;
-	int    syn    = 0;
+	int    ret    = 0;
 	char * buffer = NULL;
-
 	argv0 = argv[0];
-
 	terminal_hl_init();
-
+	highlight_c(); /* this mustn't break overrides (but definitely does) */
 	while (++argv,
-				 --argc)
-	{
-		if (**argv == '-')
-		{
-			syn = 1;
-			/* fprintf(stderr, "handle '%s'\n", *argv+1); */
-			/* lazy as hell, TODO use uthash */
-			if (strcmp(*argv+1, "c") == 0)
-			{
-				#include "syntax/c.h"
+				 --argc) {
+		if (**argv == '-') {
+			/* TODO use uthash */
+			if (strcmp(*argv+1, "c") == 0) {
+				highlight_c();
 			}
-			else
-			{
+			else {
 				fprintf(stderr, "%s: Unimplemented syntax '%s'\n", argv0, *argv+1);
 				return 1;
 			}
 		}
-		else
-		{
-			if (!syn)
-			{
-				#include "syntax/c.h"
-			}
+		else {
 			free(buffer);
 			arg = 1;
-			buffer = slurp(*argv);
-			render_string(buffer, "cterm");
-			if (!buffer)
-			{
-				perror(argv0);
-				return 1;
+			buffer = read_entire_file(*argv);
+			if (!buffer) {
+				fprintf(stderr,"%s: cannot access '%s': ", argv0, *argv);
+				perror(NULL);
+				ret = 2;
 			}
+			else
+			{ render_string(buffer, "cterm"); }
 		}
 	}
-	if (!arg)
-	{
-		if (!syn)
-		{
-			#include "syntax/c.h"
-		}
+	if (!arg) {
 		buffer = get_stdin();
 		render_string(buffer, "cterm");
 	}
-
 	fflush(stdout);
 	hl_deinit();
 	free(buffer);
-
-	//terminal_hl_deinit();
-
-	return 0;
+	return ret;
 }