string_free :: proc (a: Allocator, s: string) do free(a, s.data);
-StringSplitResult :: struct {
- tokens: ^string;
- count: u32;
-}
-
-string_split :: proc (a: Allocator, str: string, delim: u8) -> StringSplitResult {
+string_split :: proc (a: Allocator, str: string, delim: u8) -> []string {
delim_count := 0;
for i: 0, str.count do if str.data[i] == delim do delim_count += 1;
strarr[curr_str] = str.data[begin : str.count];
- return StringSplitResult.{ strarr, delim_count + 1 };
+ return strarr[0 : delim_count + 1];
}
string_substr :: proc (str: string, sub: string) -> string {
string_builder_add_u64_with_base :: proc (use sb: ^StringBuilder, n: u64, base: u64) -> ^StringBuilder {
buf : [256] u8;
- s := u64_to_string(n, 10l, Buffer.{ cast(^u8) buf, 256 });
+ s := u64_to_string(n, base, Buffer.{ cast(^u8) buf, 256 });
return string_builder_add_string(sb, s);
}
args_get(argv, argv_buf);
- main.main(argc, argv);
+ main.main(argv[0 : argc]);
}
syn keyword onyxCommentStart contained TODO NOTE BUG HACK
-syn region onyxComment start="//" end="$" keepend contains=onyxCommentStart
+syn region onyxComment start="//" end="$" keepend contains=onyxCommentStart
-syn region onyxDirective start="#" end=" " keepend
+syn region onyxDirective start="#" end=" " keepend
+
+syn region onyxString display start=+"+ skip=+\\\\\|\\"+ end=+"+ keepend
hi def link onyxKeyword Statement
hi def link onyxType Type
hi def link onyxCommentStart Todo
hi def link onyxConstant Constant
hi def link onyxDirective Constant
+hi def link onyxString String
let b:current_syntax = "onyx"
let &cpo = s:cpo_save
sb |> sba("\n") |> string_builder_to_string() |> print();
}
-main :: proc (argc: u32, argv: ^cstring) {
+make_i32_arr :: proc (a: Allocator, len: u32) -> [] i32 {
+ arr := cast(^i32) alloc(a, sizeof i32 * len);
+ return arr[0 : len];
+}
+
+main :: proc (args: []cstring) {
sb := string_builder_make(heap_allocator, 256);
timer := timer_start();
}
^sb |> sba("There are ")
- |> sba(cast(u64) argc)
+ |> sba(cast(u64) args.count)
|> sba(" arguments.\n");
- for i: 0, argc do ^sb |> sba(argv[i]) |> sba(" ");
+ for i: 0, args.count do ^sb |> sba(args.data[i]) |> sba(" ");
^sb |> sba("\n")
|> string_builder_to_string()
|> print();
fd: FileDescriptor = -1;
- if err := path_open(3, LookupFlags.SymLinkFollow, string_make(argv[1]), cast(OFlags) 0, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, FDFlags.Sync, ^fd); err != Errno.Success {
+ if err := path_open(3, LookupFlags.SymLinkFollow, string_make(args.data[1]), cast(OFlags) 0, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, Rights.DataSync | Rights.Write | Rights.Read | Rights.Tell | Rights.Seek | Rights.Advise | Rights.PathOpen | Rights.PathCreateFile, FDFlags.Sync, ^fd); err != Errno.Success {
print("Failed to open file\n");
print("Error code: ");
print_u64_with_base(cast(u64) err, 16l);
print_u64_with_base(sum, 10l);
print("\n");
-
matches := string_split(heap_allocator, "This is a test string to test splitting. It surprisingly works very well.", #char " ");
- defer free(heap_allocator, matches.tokens);
+ defer free(heap_allocator, matches.data);
string_builder_clear(^sb);
for i: 0, matches.count {
- ^sb |> sba(matches.tokens[i])
+ ^sb |> sba(matches.data[i])
|> sba("\n");
}
program := "+ + * s - /";
tokens := string_split(heap_allocator, program, #char " ");
- defer free(heap_allocator, tokens.tokens);
+ defer free(heap_allocator, tokens.data);
acc := 0;
for i: 0, tokens.count {
- tok :: tokens.tokens[i].data[0];
+ tok :: tokens.data[i].data[0];
if tok == #char "+" do acc += 1;
elseif tok == #char "-" do acc -= 1;
^sb |> string_builder_clear();
while i := 0; i < 10 {
^sb |> sba("Loop: ") |> sba(cast(u64) i) |> sba("\n");
-
+
i += 1;
} else {
print("Never ran the loop\n");
arr : [128] i32;
for i: 0, 128 do arr[i] = i * i;
- slice := arr[14 : 20];
-
- print_arr(^sb, slice);
+ print_arr(^sb, arr[5 : 10]);
- ss := string_substr("Hello, WoWorld!", "World");
+ ss := string_substr("Hello, World!", "World");
if ss.count > 0 {
print(ss);
}
OnyxToken tk;
// Skip whitespace
- while (char_is_whitespace(*tokenizer->curr) && tokenizer->curr != tokenizer->end)
- INCREMENT_CURR_TOKEN(tokenizer)
+ while (1) {
+ if (tokenizer->curr == tokenizer->end) break;
+
+ switch (*tokenizer->curr) {
+ case ' ':
+ case '\n':
+ case '\t':
+ case '\r':
+ INCREMENT_CURR_TOKEN(tokenizer);
+ break;
+ default:
+ goto whitespace_skipped;
+ }
+ }
+
+whitespace_skipped:
tk.type = Token_Type_Unknown;
tk.text = tokenizer->curr;
.tokens = NULL,
};
- bh_arr_new(allocator, tknizer.tokens, 512);
+ bh_arr_new(allocator, tknizer.tokens, 1 << 16);
return tknizer;
}
compile_expression(mod, &code, sl->lo);
WIL(WI_LOCAL_TEE, tmp_local);
- WID(WI_I32_CONST, sl->elem_size);
- WI(WI_I32_MUL);
+ if (sl->elem_size != 1) {
+ WID(WI_I32_CONST, sl->elem_size);
+ WI(WI_I32_MUL);
+ }
compile_location(mod, &code, sl->addr);
WI(WI_I32_ADD);
compile_expression(mod, &code, sl->hi);