diff --git a/ccodegen.cpp b/ccodegen.cpp index 1d08ff1..03d3607 100644 --- a/ccodegen.cpp +++ b/ccodegen.cpp @@ -262,7 +262,9 @@ gen_expr(Ast_Expr *ast, Ast_Type *type_of_var){ CASE(INDEX, Index){ gen("("); gen_expr(node->expr); - if(node->expr->resolved_type == type_string) gen(".str"); + if(is_string(node->resolved_type)) + if(!(type_of_var && type_of_var == type_pointer_to_char)) + gen(".str"); gen("["); gen_expr(node->index); gen("]"); diff --git a/programs/main.kl b/programs/main.kl index 09aefeb..6c35855 100644 --- a/programs/main.kl +++ b/programs/main.kl @@ -7,21 +7,91 @@ String32 :: struct;; str: *U32; len: S64 UTF32_Result :: struct out_str: U32 advance: S64 - error : Bool + error : S32 UTF16_Result :: struct out_str: [2]U16 len : S32 - error : Bool + error : S32 BINARY :: 0b1001 utf8_to_utf32 :: (c: *U8, max_advance: S64): UTF32_Result result: UTF32_Result + if (c[0] & 0b10000000) == 0 + if max_advance >= 1 + c0 := c[0]->U32 + result.out_str = c0 + result.advance = 1 + else;; result.error = 1 + + elif (c[0] & 0b11100000) == 0b11000000 + if (c[1] & 0b11000000) == 0b10000000 // Continuation byte required + if max_advance >= 2 + c0 := c[0]->U32; c1 := c[1]->U32 + result.out_str = (c0 & 0b00011111) << 6 | (c1 & 0b00111111) + result.advance = 2 + else;; result.error = 2 + else;; result.error = 2 + + elif (c[0] & 0b11110000) == 0b11100000 + if (c[1] & 0b11000000) == 0b10000000 && (c[2] & 0b11000000) == 0b10000000 // Two continuation bytes required + if max_advance >= 3 + c0 := c[0]->U32; c1 := c[1]->U32; c2 := c[2]->U32 + result.out_str = (c0 & 0b00001111) << 12 | (c1 & 0b00111111) << 6 | (c2 & 0b00111111) + result.advance = 3 + else;; result.error = 3 + else;; result.error = 3 + + elif (c[0] & 0b11111000) == 0b11110000 + if (c[1] & 0b11000000) == 0b10000000 && (c[2] & 0b11000000) == 0b10000000 && (c[3] & 0b11000000) == 0b10000000 // Three continuation bytes required + if max_advance >= 4 + c0 := c[0]->U32; c1 := c[1]->U32; c2 := c[2]->U32; c3 := c[3]->U32 + result.out_str = (c0 & 0b00001111) << 18 | (c1 & 0b00111111) << 12 | (c2 & 0b00111111) << 6 | (c3 & 0b00111111) + result.advance = 4 + else;; result.error = 4 + else;; result.error = 4 + else;; result.error = 4 + return result +utf32_to_utf16 :: (codepoint: U32): UTF16_Result + result: UTF16_Result + if codepoint < 0x10000 + result.out_str[0] = codepoint->U16 + result.out_str[1] = 0 + result.len = 1 + elif codepoint <= 0x10FFFF + code: U32 = (codepoint - 0x10000) + result.out_str[0] = (0xD800 | (code >> 10))->U16 + result.out_str[1] = (0xDC00 | (code & 0x3FF))->U16 + result.len = 2 + else + result.error = 1 + + return result + +// string_to_string16 :: (allocator: *Allocator, int: String): String16 +// String16 result = {exp_alloc_array(allocator, U16, (in.len*2)+1)}; // @Note(Krzosa): Should be more then enough space +// for(S64 i = 0; i < in.len;){ +// UTF32_Result decode = utf8_to_utf32(in.str + i, in.len - i); +// if(!decode.error){ +// i += decode.advance; +// UTF16_Result encode = utf32_to_utf16(decode.out_str); +// if(!encode.error){ +// for(S32 j = 0; j < encode.len; j++){ +// result.str[result.len++] = encode.out_str[j]; +// } +// } +// else unicode_error(question_mark16); +// } +// else unicode_error(question_mark16); +// } + +// result.str[result.len] = 0; +// return result; +// } + -Vec2I :: struct;; x: S32; y: S32 -Vec2 :: struct;; x: F32; y: F32 Windows_Bitmap :: struct size: Vec2I @@ -29,6 +99,10 @@ Windows_Bitmap :: struct hdc: HDC dib: HBITMAP +Vec2I :: struct;; x: S32; y: S32 +Vec2 :: struct;; x: F32; y: F32 + + create_bitmap :: (size: Vec2I, bottom_up: Bool = true): Windows_Bitmap result: Windows_Bitmap = {size = size} if bottom_up == false @@ -57,9 +131,11 @@ window_procedure :: (hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM): LRE if msg == WM_DESTROY PostQuitMessage(0) return 0 - else;; return DefWindowProc(hwnd, msg, wparam, lparam) + else;; return DefWindowProcW(hwnd, msg, wparam, lparam) main :: (argc: int, argv: **char): int bitmap := create_bitmap({1280, 720}) - + result := utf8_to_utf32(&"A"[0], 1) + result = utf8_to_utf32(&"ć"[0], 2) + result = utf8_to_utf32(&"ó"[0], 2) diff --git a/programs/user32.kl b/programs/user32.kl index 5d8ab2a..e1649ad 100644 --- a/programs/user32.kl +++ b/programs/user32.kl @@ -3,7 +3,7 @@ WNDPROC :: (hwnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM): LRESULT WNDCLASSW :: struct;; style: UINT; lpfnWndProc: WNDPROC; cbClsExtra: int; cbWndExtra: int; hInstance: HINSTANCE; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: LPCWSTR; lpszClassName: LPCWSTR PostQuitMessage :: #foreign(nExitCode: int) -DefWindowProc :: #foreign (hwnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM): LRESULT +DefWindowProcW :: #foreign (hwnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM): LRESULT GetDC :: #foreign (hWnd: HWND): HDC CreateWindowA :: #foreign (dwExStyle: DWORD, lpClassName: *char, lpWindowName: *char, dwStyle: DWORD, X: int, Y: int, nWidth: int, nHeight: int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpParam: *void): HWND CreateWindowExW :: #foreign (dwExStyle: DWORD, lpClassName: LPCWSTR, lpWindowName: LPCWSTR, dwStyle: DWORD, X: int, Y: int, nWidth: int, nHeight: int, hWndParent: HWND, hMenu: HMENU, hInstance: HINSTANCE, lpPara: LPVOID): HWND diff --git a/typechecking.cpp b/typechecking.cpp index d6989ff..817a04b 100644 --- a/typechecking.cpp +++ b/typechecking.cpp @@ -776,6 +776,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_context){ } node->index_original_type = left.type; + assert(left.type); if(is_string(left.type)){ return operand_lvalue(type_u8); }