]> git.xolatile.top Git - public-libhl.git/commitdiff
Improved main.c and syntax for the sake of the future children of the world
authorEmil <emilwilliams@tuta.io>
Wed, 20 Sep 2023 23:49:36 +0000 (23:49 +0000)
committerEmil <emilwilliams@tuta.io>
Wed, 20 Sep 2023 23:49:36 +0000 (23:49 +0000)
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
include/syntax/syntax.h [new file with mode: 0644]
source/main.c

index dffb5a9617db2ad04b6e65aa224572534d6fc71e..9624072d4fac65e2123d7340f8489041b61b5f82 100644 (file)
@@ -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 (file)
index 0000000..b19ca37
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef SYNTAX_H_
+
+#include "c.h"
+
+#define SYNTAX_H_
+#endif
index 9f51c64e9e2e45b6216797a2ea0388bdf349ccb2..b21d9d98043ab48e8635b792b3a1a074db3f5a56 100644 (file)
@@ -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;
 }