3 Commits

10 changed files with 66 additions and 125 deletions

View File

@@ -15,8 +15,6 @@ int currentInstruction = 0;
bool isMainScopeGlobal = true; bool isMainScopeGlobal = true;
char* getFileContents(const char* filename);
[[noreturn]] void customError(GroundArg type, GroundArg what, GroundInstruction* where, int whereLine, int exitCode) { [[noreturn]] void customError(GroundArg type, GroundArg what, GroundInstruction* where, int whereLine, int exitCode) {
printf("Ground runtime error:\n ErrorType: "); printf("Ground runtime error:\n ErrorType: ");
printGroundArg(&type); printGroundArg(&type);
@@ -707,7 +705,7 @@ GroundValue interpretGroundProgram(GroundProgram* in, GroundScope* inScope) {
return gv; return gv;
} }
if (ci != currentInstruction) { if (ci != currentInstruction) {
i = currentInstruction; i = ci;
} }
currentInstruction++; currentInstruction++;
} }
@@ -1898,35 +1896,38 @@ GroundValue interpretGroundInstruction(GroundInstruction inst, GroundScope* scop
} }
if (!found) { if (!found) {
snprintf(path, sizeof(path), "%s.grnd", libName); snprintf(path, sizeof(path), "./%s.grnd", libName);
if (access(path, F_OK) == 0) found = 1; if (access(path, F_OK) == 0) found = 1;
} }
if (!found) { if (!found) {
char errorMsg[1100]; char errorMsg[1100];
snprintf(errorMsg, sizeof(errorMsg), "Could not find library: %s", libName); snprintf(errorMsg, sizeof(errorMsg), "Could not find library: %s.grnd", libName);
runtimeError(FIXME, errorMsg, in, currentInstruction); runtimeError(FIXME, errorMsg, in, currentInstruction);
} }
char* fileContents = getFileContents(path); FILE* f = fopen(path, "r");
if (!f) {
runtimeError(FIXME, "Failed to open file", in, currentInstruction);
}
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
GroundProgram program = parseFile(fileContents); char* content = malloc(fsize + 1);
free(fileContents); if (!content) {
fclose(f);
runtimeError(FIXME, "Failed to allocate memory for file content", in, currentInstruction);
}
fread(content, 1, fsize, f);
fclose(f);
content[fsize] = 0;
GroundScope newScope = { GroundProgram program = parseFile(content);
.variables = scope->variables, free(content);
.labels = malloc(sizeof(GroundLabel*)),
.isMainScope = false
};
*newScope.labels = NULL;
int ci = currentInstruction;
interpretGroundProgram(&program, &newScope);
currentInstruction = ci;
interpretGroundProgram(&program, scope);
freeGroundProgram(&program);
break; break;
} }

View File

@@ -1,15 +1,27 @@
set &x 5 set &x 5
PAUSE
fun !dingle -function -int &a fun !dingle -function -int &a
PAUSE
fun !capture -int -int &b fun !capture -int -int &b
PAUSE
add $a $b &tmp add $a $b &tmp
add $tmp $x &tmp add $tmp $x &tmp
return $tmp return $tmp
endfun endfun
return $capture return $capture
endfun endfun
set &x 10
call !dingle 3 &result call !dingle 3 &result
PAUSE
call !result 5 &y call !result 5 &y
println $y $x println $y

View File

@@ -1,4 +1,4 @@
set &x "dingus" set &x "dingus"
println $x PAUSE
drop &x drop &x
println $x PAUSE

View File

@@ -1,4 +1,7 @@
fun !lib_PrintHello -int fun !lib_PrintHello -int
println "Hello" println "Hello, world!"
return 0 return 0
endfun endfun
println "Hello!"
println "Hello!"

View File

@@ -1,6 +1,5 @@
# A cool list # A cool list
setlist &favWords "hello" "there" "general" setlist &favWords "hello" "there" "general" "kenobi"
listappend &favWords "kenobi"
println $favWords println $favWords
set &count 0 set &count 0

View File

@@ -1,5 +0,0 @@
[hello, there, general, hello]
hello
there
general
 ,WV

11
tests/pause.grnd Normal file
View File

@@ -0,0 +1,11 @@
fun !dingle -int
endfun
set &x 5
set &y "dingle"
PAUSE
println "continuing"
println "step through here"
println "step again"
println "and again"

View File

@@ -18,7 +18,7 @@ fun !fib -int -int &n -function &fib
endfun endfun
# Main program # Main program
println "Computing fib(20) recursively..." println "Computing fib(30) recursively..."
call !fib 20 $fib &answer call !fib 30 $fib &answer
println "Result:" $answer println "Result:" $answer
end end

View File

@@ -1,80 +0,0 @@
#!/usr/bin/env bash
echo "" > log.txt
for f in *.grnd; do
[ -e "$f" ] || continue # skip if no files match
# Files to skip over
if [[ "$f" == "lib.grnd" ]] ||
[[ "$f" == "string.grnd" ]] ||
[[ "$f" == "test.grnd" ]] ||
[[ "$f" == "to1000.grnd" ]] ||
[[ "$f" == "uhoh.grnd" ]];
then continue
fi
echo "Running $f"
ground "$f" > log.txt
FILE="log.txt"
FAILED="\033[31mFailed:\n\033[0m"
if [[ "$f" == "closure.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "13 10\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "convs.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "32\n12\n3.140000\na\n97\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "drop.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "dingus\nGround runtime error:\n ErrorType: UnknownVariable\n ErrorInstruction: println \$x\n ErrorLine: 4\n"));
then printf "\033[31mFailed\n\033[0m"
exit 1
fi
elif [[ "$f" == "error.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "Ground runtime error:\n ErrorType: Hello\n ErrorContext: [1, 2, 3, Hi!]\n ErrorInstruction: error \"Hello\" [1, 2, 3, Hi!] 1\n ErrorLine: 2\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "fib.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "Fibonacci result: 7540113804746346429\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "function.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "dingle\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "list.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "[hello, there, general, kenobi]\nhello\nthere\ngeneral\nkenobi\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "recursivefib.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "Computing fib(20) recursively...\nResult: 6765\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "simple.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "dingus\ndinglefart\n5.840000\n464773025\n5164.120000\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "struct.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "53\n32\n"));
then printf $FAILED
exit 1
fi
elif [[ "$f" == "use.grnd" ]]; then
if !(cmp -s "$FILE" <(printf "Hello\n"));
then printf $FAILED
exit 1
fi
else
printf "\033[31mCould not find test case\n\033[0m"
exit 1
fi
done
printf "\033[32mAll tests passed!\n\033[0m"
exit 0