print(c + 1);
}
-print_string :: proc (s: string) {
+print_string :: proc (s: string) -> u32 {
vec := IOVec.{ buf = s.data, len = s.len };
tmp : Size;
fd_write(1, IOVecArray.{ ^vec, 1 }, ^tmp);
fd_datasync(1);
+
+ return tmp;
}
-print_u8 :: proc (s: cstring) {
- string_make(s) |> print_string();
+print_u8 :: proc (s: cstring) -> u32 {
+ return string_make(s) |> print_string();
}
print :: proc #overloaded { print_string, print_u8 }
return true;
}
+Vec3 :: struct {
+ x: f32;
+ y: f32;
+ z: f32;
+}
+
+S :: struct {
+ name: string;
+ age: u32;
+ pos: Vec3;
+}
+
+output_s :: proc (sb: ^StringBuilder, s: ^S) -> ^StringBuilder {
+ sb |> sba("Hello, I'm ")
+ |> sba(s.name)
+ |> sba(". I am ")
+ |> sba(cast(u64) s.age)
+ |> sba(" years old. I am at (")
+ |> sba(cast(u64) s.pos.x) |> sba(", ")
+ |> sba(cast(u64) s.pos.y) |> sba(", ")
+ |> sba(cast(u64) s.pos.z) |> sba(").\n");
+
+ return sb;
+}
+
main :: proc (argc: u32, argv: ^cstring) {
- sb := string_builder_make(^heap_allocator, 16);
+ sb := string_builder_make(^heap_allocator, 256);
timer := timer_start();
defer {
|> print();
}
- ^sb |> sba("\x01\x02\x03There are ")
+ ^sb |> sba("There are ")
|> sba(cast(u64) argc)
- |> sba(" arguments.\n")
- |> string_builder_to_string()
- |> print();
-
- string_builder_clear(^sb);
+ |> sba(" arguments.\n");
for i: 0, argc do ^sb |> sba(argv[i]) |> sba(" ");
^sb |> sba("\n")
string_builder_clear(^sb);
^sb |> sba("The program evaluated to '") |> sba(cast(u64) acc) |> sba("'\n");
^sb |> string_builder_to_string() |> print();
+ ^sb |> string_builder_clear();
+
+ person := S.{ name = "Tester", age = 45, pos = Vec3.{ 1.0f, 2.0f, 3.0f } };
+ ^sb |> output_s(^person)
+ |> sba("Here is another message in the same string!\n")
+ |> string_builder_to_string()
+ |> print();
}
goto token_parsed;
}
- LITERAL_TOKEN("package", 1, Token_Type_Keyword_Package);
- LITERAL_TOKEN("struct", 1, Token_Type_Keyword_Struct);
- LITERAL_TOKEN("enum" , 1, Token_Type_Keyword_Enum);
- LITERAL_TOKEN("use", 1, Token_Type_Keyword_Use);
- LITERAL_TOKEN("if", 1, Token_Type_Keyword_If);
- LITERAL_TOKEN("elseif", 1, Token_Type_Keyword_Elseif);
- LITERAL_TOKEN("else", 1, Token_Type_Keyword_Else);
- LITERAL_TOKEN("global", 1, Token_Type_Keyword_Global);
- LITERAL_TOKEN("return", 1, Token_Type_Keyword_Return);
- LITERAL_TOKEN("proc", 1, Token_Type_Keyword_Proc);
- LITERAL_TOKEN("as", 1, Token_Type_Keyword_As);
- LITERAL_TOKEN("cast", 1, Token_Type_Keyword_Cast);
- LITERAL_TOKEN("while", 1, Token_Type_Keyword_While);
- LITERAL_TOKEN("for", 1, Token_Type_Keyword_For);
- LITERAL_TOKEN("break", 1, Token_Type_Keyword_Break);
- LITERAL_TOKEN("continue", 1, Token_Type_Keyword_Continue);
- LITERAL_TOKEN("sizeof", 1, Token_Type_Keyword_Sizeof);
- LITERAL_TOKEN("alignof", 1, Token_Type_Keyword_Alignof);
- LITERAL_TOKEN("defer", 1, Token_Type_Keyword_Defer);
- LITERAL_TOKEN("do", 1, Token_Type_Keyword_Do);
- LITERAL_TOKEN("true", 1, Token_Type_Literal_True);
- LITERAL_TOKEN("false", 1, Token_Type_Literal_False);
- LITERAL_TOKEN("->", 0, Token_Type_Right_Arrow);
- LITERAL_TOKEN("<-", 0, Token_Type_Right_Arrow);
- LITERAL_TOKEN("---", 0, Token_Type_Empty_Block);
- LITERAL_TOKEN("|>", 0, Token_Type_Pipe);
- LITERAL_TOKEN("&&", 0, Token_Type_And_And);
- LITERAL_TOKEN("||", 0, Token_Type_Or_Or);
- LITERAL_TOKEN(">>>=", 0, Token_Type_Sar_Equal);
- LITERAL_TOKEN(">>=", 0, Token_Type_Shr_Equal);
- LITERAL_TOKEN("<<=", 0, Token_Type_Shl_Equal);
- LITERAL_TOKEN(">>>", 0, Token_Type_Shift_Arith_Right);
- LITERAL_TOKEN(">>", 0, Token_Type_Shift_Right);
- LITERAL_TOKEN("<<", 0, Token_Type_Shift_Left);
- LITERAL_TOKEN("&=", 0, Token_Type_And_Equal);
- LITERAL_TOKEN("|=", 0, Token_Type_Or_Equal);
- LITERAL_TOKEN("^=", 0, Token_Type_Xor_Equal);
- LITERAL_TOKEN("<=", 0, Token_Type_Less_Equal);
- LITERAL_TOKEN(">=", 0, Token_Type_Greater_Equal);
- LITERAL_TOKEN("==", 0, Token_Type_Equal_Equal);
- LITERAL_TOKEN("!=", 0, Token_Type_Not_Equal);
- LITERAL_TOKEN("+=", 0, Token_Type_Plus_Equal);
- LITERAL_TOKEN("-=", 0, Token_Type_Minus_Equal);
- LITERAL_TOKEN("*=", 0, Token_Type_Star_Equal);
- LITERAL_TOKEN("/=", 0, Token_Type_Fslash_Equal);
- LITERAL_TOKEN("%=", 0, Token_Type_Percent_Equal);
+ char curr = *tokenizer->curr;
+ switch (curr) {
+ case 'a':
+ LITERAL_TOKEN("alignof", 1, Token_Type_Keyword_Alignof);
+ LITERAL_TOKEN("as", 1, Token_Type_Keyword_As);
+ break;
+ case 'b':
+ LITERAL_TOKEN("break", 1, Token_Type_Keyword_Break);
+ break;
+ case 'c':
+ LITERAL_TOKEN("cast", 1, Token_Type_Keyword_Cast);
+ LITERAL_TOKEN("continue", 1, Token_Type_Keyword_Continue);
+ break;
+ case 'd':
+ LITERAL_TOKEN("defer", 1, Token_Type_Keyword_Defer);
+ LITERAL_TOKEN("do", 1, Token_Type_Keyword_Do);
+ break;
+ case 'e':
+ LITERAL_TOKEN("enum" , 1, Token_Type_Keyword_Enum);
+ LITERAL_TOKEN("elseif", 1, Token_Type_Keyword_Elseif);
+ LITERAL_TOKEN("else", 1, Token_Type_Keyword_Else);
+ break;
+ case 'f':
+ LITERAL_TOKEN("for", 1, Token_Type_Keyword_For);
+ LITERAL_TOKEN("false", 1, Token_Type_Literal_False);
+ break;
+ case 'g':
+ LITERAL_TOKEN("global", 1, Token_Type_Keyword_Global);
+ break;
+ case 'i':
+ LITERAL_TOKEN("if", 1, Token_Type_Keyword_If);
+ break;
+ case 'p':
+ LITERAL_TOKEN("package", 1, Token_Type_Keyword_Package);
+ LITERAL_TOKEN("proc", 1, Token_Type_Keyword_Proc);
+ break;
+ case 'r':
+ LITERAL_TOKEN("return", 1, Token_Type_Keyword_Return);
+ break;
+ case 's':
+ LITERAL_TOKEN("sizeof", 1, Token_Type_Keyword_Sizeof);
+ LITERAL_TOKEN("struct", 1, Token_Type_Keyword_Struct);
+ break;
+ case 't':
+ LITERAL_TOKEN("true", 1, Token_Type_Literal_True);
+ break;
+ case 'u':
+ LITERAL_TOKEN("use", 1, Token_Type_Keyword_Use);
+ break;
+ case 'w':
+ LITERAL_TOKEN("while", 1, Token_Type_Keyword_While);
+ break;
+
+ case '-':
+ LITERAL_TOKEN("->", 0, Token_Type_Right_Arrow);
+ LITERAL_TOKEN("---", 0, Token_Type_Empty_Block);
+ LITERAL_TOKEN("-=", 0, Token_Type_Minus_Equal);
+ break;
+
+ case '<':
+ LITERAL_TOKEN("<-", 0, Token_Type_Right_Arrow);
+ LITERAL_TOKEN("<<=", 0, Token_Type_Shl_Equal);
+ LITERAL_TOKEN("<<", 0, Token_Type_Shift_Left);
+ LITERAL_TOKEN("<=", 0, Token_Type_Less_Equal);
+ break;
+
+ case '>':
+ LITERAL_TOKEN(">>>=", 0, Token_Type_Sar_Equal);
+ LITERAL_TOKEN(">>=", 0, Token_Type_Shr_Equal);
+ LITERAL_TOKEN(">>>", 0, Token_Type_Shift_Arith_Right);
+ LITERAL_TOKEN(">>", 0, Token_Type_Shift_Right);
+ LITERAL_TOKEN(">=", 0, Token_Type_Greater_Equal);
+ break;
+
+ case '&':
+ LITERAL_TOKEN("&&", 0, Token_Type_And_And);
+ LITERAL_TOKEN("&=", 0, Token_Type_And_Equal);
+ break;
+
+ case '|':
+ LITERAL_TOKEN("|>", 0, Token_Type_Pipe);
+ LITERAL_TOKEN("||", 0, Token_Type_Or_Or);
+ LITERAL_TOKEN("|=", 0, Token_Type_Or_Equal);
+ break;
+
+ default:
+ LITERAL_TOKEN("^=", 0, Token_Type_Xor_Equal);
+ LITERAL_TOKEN("==", 0, Token_Type_Equal_Equal);
+ LITERAL_TOKEN("!=", 0, Token_Type_Not_Equal);
+ LITERAL_TOKEN("+=", 0, Token_Type_Plus_Equal);
+ LITERAL_TOKEN("*=", 0, Token_Type_Star_Equal);
+ LITERAL_TOKEN("/=", 0, Token_Type_Fslash_Equal);
+ LITERAL_TOKEN("%=", 0, Token_Type_Percent_Equal);
+ break;
+ }
// Symbols
if (char_is_alpha(*tk.text) || *tokenizer->curr == '_') {