]> git.eli173.com Git - klapaucius/commitdiff
added tostr, fixed a couple memory leaks main
authorElijah Cohen <cohen@eli173.com>
Sat, 23 Nov 2024 01:13:53 +0000 (01:13 +0000)
committerElijah Cohen <cohen@eli173.com>
Sat, 23 Nov 2024 01:13:53 +0000 (01:13 +0000)
src/builtins/io.c
src/builtins/strings.c
src/builtins/strings.h
src/test.c

index ef3f83d849001d4fb318d37d7cd4660893c1eda1..c5141988ab8c62264e4fa58c0bef720278217cdd 100644 (file)
@@ -30,10 +30,12 @@ Sexpr* io_printstr(Sexpr* b, Sexpr* rest, Sexpr* env) {
        Sexpr* arg = eval(clone(car(b->value.b.args)), env);
        if(arg->type != STR) {
                sexpr_free(b);
+               sexpr_free(arg);
                return cons(from_nil(), rest);
        }
        PRINT(arg->value.str);
        sexpr_free(b);
+       sexpr_free(arg);
        return cons(from_t(), rest);
 }
 
@@ -72,6 +74,8 @@ Sexpr* io_readfile(Sexpr* b, Sexpr* rest, Sexpr* env) {
                sexpr_free(b);
                return cons(from_nil(), rest);
        }
+       sexpr_free(firstarg);
+       sexpr_free(b);
        fseek(thefile, 0, SEEK_END);
        size_t fsz = ftell(thefile);
        fseek(thefile, 0, SEEK_SET);
index 09a1d04a4423ac28745f51d0065a7550433f483f..71182959fa0701a2be6742a593525c4df1826550 100644 (file)
@@ -20,11 +20,13 @@ Sexpr* s_strlen(Sexpr* b, Sexpr* rest, Sexpr* env) {
        if(unquote(arg)->type != STR) {
                ERR("strlen: ", "argument not string");
                sexpr_free(b);
+               sexpr_free(arg);
                return cons(from_nil(), rest);
        }
 #endif // typecheck
        size_t sl = strlen(unquote(arg)->value.str);
        sexpr_free(b);
+       sexpr_free(arg);
        return cons (from_uint(sl), rest);
 }
 
@@ -184,6 +186,20 @@ Sexpr* s_strtok(Sexpr* b, Sexpr* rest, Sexpr* env) {
        return cons(from_quote(newres), rest);
 }
 
+Sexpr* s_tostr(Sexpr* b, Sexpr* rest, Sexpr* env) {
+       if(STRINGS_TOSTR_ARGS != u64_get_num_args(b)) {
+               return cons(b, rest);
+       }
+       Sexpr* args = b->value.b.args;
+       Sexpr* arg = eval(clone(car(args)), env);
+       char* thestr = sprint_sexpr(arg);
+       Sexpr* out = cons(from_string(thestr), rest);
+       free(thestr);
+       sexpr_free(arg);
+       sexpr_free(b);
+       return out;
+}
+
 
 Sexpr* x_strings_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
        uint64_t code = b->value.b.opcode & 0xff;
@@ -200,6 +216,8 @@ Sexpr* x_strings_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
                return s_substr(b, rest, env);
        case STRINGS_STRTOK:
                return s_strtok(b, rest, env);
+       case STRINGS_TOSTR:
+               return s_tostr(b, rest, env);
        default:
                return from_nil();
        }
@@ -210,9 +228,10 @@ Sexpr* x_strings_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
 Sexpr* load_strings_env(Sexpr* env) {
        load_builtin(STRINGS_STRLEN_STR, (STRINGS_PREFIX << 8) | STRINGS_STRLEN, env);
        load_builtin(STRINGS_STRCAT_STR, (STRINGS_PREFIX << 8) | STRINGS_STRCAT, env);
-               load_builtin(STRINGS_STRAT_STR, (STRINGS_PREFIX << 8) | STRINGS_STRAT, env);
-               load_builtin(STRINGS_STREXPAND_STR, (STRINGS_PREFIX << 8) | STRINGS_STREXPAND, env);
-                               load_builtin(STRINGS_SUBSTR_STR, (STRINGS_PREFIX << 8) | STRINGS_SUBSTR, env);
-                               load_builtin(STRINGS_STRTOK_STR, (STRINGS_PREFIX << 8) | STRINGS_STRTOK, env);
+       load_builtin(STRINGS_STRAT_STR, (STRINGS_PREFIX << 8) | STRINGS_STRAT, env);
+       load_builtin(STRINGS_STREXPAND_STR, (STRINGS_PREFIX << 8) | STRINGS_STREXPAND, env);
+       load_builtin(STRINGS_SUBSTR_STR, (STRINGS_PREFIX << 8) | STRINGS_SUBSTR, env);
+       load_builtin(STRINGS_STRTOK_STR, (STRINGS_PREFIX << 8) | STRINGS_STRTOK, env);
+       load_builtin(STRINGS_TOSTR_STR, (STRINGS_PREFIX << 8) | STRINGS_TOSTR, env);
        return env;
 }
index f5d2defe8298690c1e8610d2f1ef2d8325e62079..289eea58ba04ee95b4a390c1507f27859ed87727 100644 (file)
@@ -25,6 +25,9 @@
 #define STRINGS_STRTOK 0x05
 #define STRINGS_STRTOK_ARGS 2
 #define STRINGS_STRTOK_STR "strtok"
+#define STRINGS_TOSTR 0x06
+#define STRINGS_TOSTR_ARGS 1
+#define STRINGS_TOSTR_STR "tostr"
 
 Sexpr* x_strings_dispatch(Sexpr* s, Sexpr* rest, Sexpr* env);
 Sexpr* load_strings_env(Sexpr* env);
index 8b6611db253ba31148526c2fc4cdbdd60ca93618..5514e9d4df2e3e3b0866e5b5e969b0afe7a67474 100644 (file)
@@ -340,7 +340,34 @@ void eval_tests() {
 
        run_eval_test("(+ 5 (* 5))");
        run_eval_test("(car 5)");
+
+       run_eval_test("\"testing\"");
+       run_eval_test("(strlen \"hi\")");
+       run_eval_test("(strlen 54)");
+       run_eval_test("(strcat \"hi \" \"there\")");
+       run_eval_test("(strcat \"hi \" 55)");
+       run_eval_test("(strat 5 \"hello world\")");
+       run_eval_test("(strat nil \"hello world\")");
+       run_eval_test("(strexpand \"test\")");
+       run_eval_test("(strexpand 43)");
+       run_eval_test("(substr \"oo\" \"looopy loop\")");
+       run_eval_test("(substr 74 \"looopy loop\")");
+       run_eval_test("(strtok \" /\" \"this/is a/test\")");
+       run_eval_test("(strtok \" /\" 65)");
+
+       run_eval_test("(print 65)");
+       run_eval_test("(printstr 65)");
+       run_eval_test("(printstr \"test\")");
+       run_eval_test("(pb (+ 5))");
        
+       run_eval_test("(writefile \"neverusethisforanythingelse.txt\" \"test\noutput\")");
+       run_eval_test("(writefile 54 \"test output\")");
+       run_eval_test("(readfile \"neverusethisforanythingelse.txt\")");
+       run_eval_test("(readfile 63)");
+       run_eval_test("(readfile \"fileoughtnotexist.txt\")");
+
+       run_eval_test("(tostr (cons 43 \"test\"))");
+
 }
 
 void many_asserts() {
@@ -420,7 +447,7 @@ void run_tests(){
        //isolating_problem();
        //test_string_parsing();
        eval_tests();
-       many_asserts();
+       //many_asserts();
        //memtest_eval();
        //mem_testing();
        //mem_parser();