7ee6a73ea4
Add standard library modules: - Std::String: strlen, strcmp, concat, copy, starts_with wrappers - Std::Map: linear-probing hash map with String keys, int values Add error handling: - Result and Option algebraic enum examples - ? try operator for automatic error propagation in HIR lowering Compiler bugfixes: - Fix sizeof() for user-defined structs (new hSizeOf HIR node) - Fix HIR type lowering for char8, bool8, int8, uint8, etc. - Fix let statement lowering for pointer types (*char8 → int* bug) - Fix PrintInt ABI mismatch (int64_t → int in io.c) - Fix Makefile test bug (_test_tmp_pkg already exists) Documentation: - Rewrite README.md with features, examples, project structure - Add docs/LanguageRef.md — complete language reference - Add docs/Stdlib.md — standard library documentation - Add docs/BuildAndTest.md — build and test guide New examples: strings, map, result_option, try_operator (13 total)
46 lines
1.2 KiB
Plaintext
46 lines
1.2 KiB
Plaintext
module Std::String {
|
|
|
|
extern func bux_strlen(s: String) -> uint;
|
|
extern func bux_strcmp(a: String, b: String) -> int;
|
|
extern func bux_strncmp(a: String, b: String, n: uint) -> int;
|
|
extern func bux_strcpy(dest: *char8, src: String) -> *char8;
|
|
extern func bux_strcat(dest: *char8, src: String) -> *char8;
|
|
extern func bux_strncpy(dest: *char8, src: String, n: uint) -> *char8;
|
|
|
|
func String_Len(s: String) -> uint {
|
|
return bux_strlen(s);
|
|
}
|
|
|
|
func String_Eq(a: String, b: String) -> bool {
|
|
return bux_strcmp(a, b) == 0;
|
|
}
|
|
|
|
func String_Concat(a: String, b: String) -> String {
|
|
let len_a: uint = bux_strlen(a);
|
|
let len_b: uint = bux_strlen(b);
|
|
let total: uint = len_a + len_b + 1;
|
|
let buf: *char8 = bux_alloc(total) as *char8;
|
|
bux_strcpy(buf, a);
|
|
bux_strcat(buf, b);
|
|
return buf;
|
|
}
|
|
|
|
func String_Copy(s: String) -> String {
|
|
let len: uint = bux_strlen(s);
|
|
let buf: *char8 = bux_alloc(len + 1) as *char8;
|
|
bux_strcpy(buf, s);
|
|
return buf;
|
|
}
|
|
|
|
func String_StartsWith(s: String, prefix: String) -> bool {
|
|
let s_len: uint = bux_strlen(s);
|
|
let p_len: uint = bux_strlen(prefix);
|
|
if p_len > s_len {
|
|
return false;
|
|
}
|
|
let r: int = bux_strncmp(s, prefix, p_len);
|
|
return r == 0;
|
|
}
|
|
|
|
}
|