cleanup and random additions
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 18 Aug 2021 12:36:43 +0000 (07:36 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 18 Aug 2021 12:36:43 +0000 (07:36 -0500)
bin/onyx
core/container/set.onyx
core/io/file.onyx
core/memory.onyx
core/string.onyx
modules/ui/components/scrollable_region.onyx
src/onyxastnodes.c
src/onyxclone.c

index 755a2379652bb145515b97ed51b9e4875e426d71..828be4578e1b587992cee64d2bc63c0f1e2f2a3e 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index ceb87d655c4e7fd9f6c60106dc624428e38f5976..9f5b163b7f07f97a3ec6a8d335e53ce0fbd0d9ad 100644 (file)
@@ -50,6 +50,8 @@ insert :: (use set: ^Set($T), value: T) {
     hashes[lr.hash_index] = entries.count - 1;
 }
 
+#operator << macro (set: Set($T), value: T) do (package core.set).insert(^set, value);
+
 has :: (use set: ^Set($T), value: T) -> bool {
     lr := lookup(set, value);
     return lr.entry_index >= 0;
index c13f99a5b6e695f0bf85217d415da1180a7c2d8e..5d250d817d31de34a4640b97b3a5ab1f04917ab2 100644 (file)
@@ -72,12 +72,12 @@ file_open :: (path: str, mode := OpenMode.Read, flags := FDFlags.Sync) -> (File,
     switch mode {
         case .Write {
             open_flags |= OFlags.Creat | OFlags.Trunc;
-            rights     |= Rights.Write;
+            rights     |= Rights.Write | Rights.Seek | Rights.Tell;
         }
 
         case .Append {
             open_flags |= OFlags.Creat;
-            rights     |= Rights.Write;
+            rights     |= Rights.Write | Rights.Seek | Rights.Tell;
             fd_flags   |= FDFlags.Append;
         }
 
index 2f0ae4ad352bb7785eeab3865bb48a9c2b3a47b7..17a99ea98bf1d09840caf73c1554e89ad99d2b08 100644 (file)
@@ -38,7 +38,7 @@ alloc_slice :: (sl: ^[] $T, count: i32, allocator := context.allocator) {
 }
 
 make_slice :: ($T: type_expr, count: i32, allocator := context.allocator) -> [] T {
-    return <[] T>.{
+    return .{
         data = raw_alloc(allocator, sizeof T * count),
         count = count
     };
@@ -52,6 +52,13 @@ free_slice :: (sl: ^[] $T, allocator := context.allocator) {
     sl.count = 0;
 }
 
+copy_slice :: (sl: [] $T, allocator := context.allocator) -> [] T {
+    data := raw_alloc(allocator, sl.count * sizeof T);
+    copy(data, sl.data, sl.count * sizeof T);
+
+    return .{ data = data, count = sl.count };
+}
+
 align :: #match {
     (size: ^u64, align: u64) {
         if *size % align != 0 {
index 66266453579dd63b001b5550007735dbab746d63..4cafb683fce804a9a61f200fe59e8da5ee0de8df 100644 (file)
@@ -169,7 +169,6 @@ ends_with :: (s: str, suffix: str) -> bool {
     return true;
 }
 
-
 strip_leading_whitespace :: #match {
     (s: ^str) {
         while true do switch s.data[0] {
index 1f30bab38f7a3ce373cd01780d266015bedadd92..5b9d188dcb4c0e21e79e90802fe438e104eaecbd 100644 (file)
@@ -12,7 +12,15 @@ Scrollable_Region_State :: struct {
 #private
 scrollable_region_states : map.Map(UI_Id, Scrollable_Region_State);
 
-scrollable_region_start :: (use r: Rectangle, minimum_y := 0.0f, maximum_y := 10000.0f, site := #callsite, state: ^Scrollable_Region_State = null) {
+Scrollable_Region_Controls :: struct {
+    minimum_y := 0.0f;
+    maximum_y := 10000.0f; // Senseless default
+    minimum_x := 0.0f;
+    maximum_x := 10000.0f; // Senseless default
+}
+
+scrollable_region_start :: (use r: Rectangle, use src: Scrollable_Region_Controls = .{},
+                            site := #callsite, state: ^Scrollable_Region_State = null) {
     hash := get_site_hash(site, 0);
     x, y := Rectangle.top_left(r);
     width, height := Rectangle.dimensions(r);
@@ -36,11 +44,14 @@ scrollable_region_start :: (use r: Rectangle, minimum_y := 0.0f, maximum_y := 10
 
         if is_key_down(38)  do state.transform.translation.y += speed;
         if is_key_down(40)  do state.transform.translation.y -= speed;
+        if is_key_down(37)  do state.transform.translation.x -= speed;
+        if is_key_down(39)  do state.transform.translation.x += speed;
 
         if mouse_state.dwheel > 0 do state.transform.translation.y += speed;
         if mouse_state.dwheel < 0 do state.transform.translation.y -= speed;
 
         state.transform.translation.y = math.clamp(state.transform.translation.y, -maximum_y, minimum_y);
+        state.transform.translation.x = math.clamp(state.transform.translation.x, -maximum_x, minimum_x);
     }
 
     gfx.push_scissor(x, y, width, height);
index 45f4f04c227362b1af52350bc9f08cdd6c8cf07f..86c30aa88d10b58ae1e2a8ca1d6c447ea3ee2bdc 100644 (file)
@@ -715,6 +715,15 @@ b32 cast_is_legal(Type* from_, Type* to_, char** err_msg) {
     Type* from = from_;
     Type* to   = to_;
 
+    if (from == NULL) {
+        if (err_msg) *err_msg = "'from' is null. (Compiler Error)";
+        return 0;
+    }
+    if (to == NULL) {
+        if (err_msg) *err_msg = "'to' is null. (Compiler Error)";
+        return 0;
+    }
+
     if (from->kind == Type_Kind_Enum) from = from->Enum.backing;
     if (to->kind == Type_Kind_Enum) to = to->Enum.backing;
 
index 3c0b5f2c01b63208eaa84692697d241f909b857f..8b5e85316a1e4d4e31d0a4d2644a054a7a93801a 100644 (file)
@@ -17,6 +17,7 @@ static inline b32 should_clone(AstNode* node) {
                case Ast_Kind_Polymorphic_Proc:
                case Ast_Kind_Alias:
                case Ast_Kind_Code_Block:
+               case Ast_Kind_Macro:
                        return 0;
 
                default: return 1;