151 lines
3.8 KiB
Plaintext
151 lines
3.8 KiB
Plaintext
|
|
// stdlib.slg
|
|
|
|
fn exit(status_code: int) #[builtin(Exit)] {}
|
|
|
|
fn print(msg: string) #[builtin(Print)] {}
|
|
fn println(msg: string) { print(msg + "\n") }
|
|
|
|
fn int_to_string(number: int) -> string #[builtin(IntToString)] {}
|
|
|
|
fn string_push_char(str: string, value: int) -> string #[builtin(StringPushChar)] {}
|
|
fn string_char_at(str: string, index: int) -> int #[builtin(StringCharAt)] {}
|
|
fn string_length(str: string) -> int #[builtin(StringLength)] {}
|
|
fn string_to_int(str: string) -> int #[builtin(StringToInt)] {}
|
|
|
|
fn array_new<T>() -> [T] #[builtin(ArrayNew)] {}
|
|
fn array_push<T>(array: [T], value: T) #[builtin(ArrayPush)] {}
|
|
fn array_length<T>(array: [T]) -> int #[builtin(ArrayLength)] {}
|
|
fn array_at<T>(array: [T], index: int) -> T #[builtin(ArrayAt)] {}
|
|
|
|
fn file_open(filename: string, mode: string) -> int #[builtin(FileOpen)] {}
|
|
fn file_close(file: int) #[builtin(FileClose)] {}
|
|
fn file_write_string(file: int, content: string) -> int #[builtin(FileWriteString)] {}
|
|
fn file_read_char(file: int) -> int #[builtin(FileReadChar)] {}
|
|
fn file_read_to_string(file: int) -> string #[builtin(FileReadToString)] {}
|
|
fn file_flush(file: int) #[builtin(FileFlush)] {}
|
|
fn file_eof(file: int) -> bool #[builtin(FileEof)] {}
|
|
|
|
fn itos(number: int) -> string #[builtin(IntToString)] {}
|
|
fn stoi(str: string) -> int #[builtin(StringToInt)] {}
|
|
|
|
fn stdin() -> int { 0 }
|
|
fn stdout() -> int { 1 }
|
|
fn stderr() -> int { 2 }
|
|
|
|
fn file_read_line(file: int) -> string {
|
|
let line = "";
|
|
loop {
|
|
if file_eof(file) {
|
|
break;
|
|
}
|
|
let ch = file_read_char(file);
|
|
if ch == "\n"[0] {
|
|
break;
|
|
}
|
|
line = string_push_char(line, ch);
|
|
}
|
|
line
|
|
}
|
|
|
|
fn read_text_file(filename: string) -> string {
|
|
let file = file_open(filename, "r");
|
|
let text = file_read_to_string(file);
|
|
file_close(file);
|
|
text
|
|
}
|
|
|
|
fn input(prompt: string) -> string {
|
|
print("> ");
|
|
file_flush(stdout());
|
|
file_read_line(stdin())
|
|
}
|
|
|
|
fn string_abs(number: int) -> int {
|
|
let result = number;
|
|
if number < 0 {
|
|
result = number - (number * 2);
|
|
}
|
|
result
|
|
}
|
|
|
|
fn string_split(str: string, seperator: int) -> [string] {
|
|
let result = array_new::<string>();
|
|
|
|
let i = 0;
|
|
let current_str = "";
|
|
loop {
|
|
if i >= string_length(str) {
|
|
break;
|
|
}
|
|
let char = str[i];
|
|
if char == seperator {
|
|
array_push(result, current_str);
|
|
current_str = "";
|
|
} else {
|
|
current_str = string_push_char(current_str, char);
|
|
}
|
|
i = i + 1;
|
|
}
|
|
array_push(result, current_str);
|
|
result
|
|
}
|
|
|
|
fn string_slice(str: string, from: int, to: int) -> string {
|
|
let result = "";
|
|
let i = from;
|
|
loop {
|
|
if i >= string_length(str) {
|
|
break;
|
|
}
|
|
if i >= to {
|
|
break;
|
|
}
|
|
result = string_push_char(result, str[i]);
|
|
i = i + 1;
|
|
}
|
|
result
|
|
}
|
|
|
|
fn string_contains(str: string, ch: int) -> bool {
|
|
let len = string_length(str);
|
|
for (let i = 0; i < len; i += 1) {
|
|
if str[i] == ch {
|
|
return true;
|
|
}
|
|
}
|
|
false
|
|
}
|
|
|
|
fn array_clone<T>(array: [T]) -> [T] {
|
|
let len = array_length(array);
|
|
let result = array_new::<T>();
|
|
let i = 0;
|
|
loop {
|
|
if i >= len { break; }
|
|
array_push(result, array[i]);
|
|
i = 1 + 1;
|
|
}
|
|
result
|
|
}
|
|
|
|
fn array_sort_mut(array: [int]) {
|
|
let len = array_length(array);
|
|
for (let i = 0; i < len; i += 1) {
|
|
for (let j = i + 1; j < len; j += 1) {
|
|
if array[j] < array[i] {
|
|
let tmp = array[j];
|
|
array[j] = array[i];
|
|
array[i] = tmp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn array_to_sorted(array: [int]) -> [int] {
|
|
let cloned = array_clone(array);
|
|
array_sort_mut(array);
|
|
cloned
|
|
}
|
|
|