decl.om (2017B)
1 struct decl { 2 node: rbnode; 3 4 name: *byte; 5 member_name: *byte; 6 7 used_next: *decl; 8 used_forward: int; 9 used_backward: int; 10 11 func_defined: int; 12 func_type: *type; 13 func_label: *label; 14 func_used: int; 15 func_def: *node; 16 func_ir: *irfunc; 17 func_stdlib: int; 18 19 struct_defined: int; 20 struct_size: int; 21 struct_layout_done: int; 22 struct_def: *node; 23 struct_type: *type; 24 25 member_defined: int; 26 member_type: *type; 27 member_offset: int; 28 29 enum_defined: int; 30 enum_value: int; 31 32 var_defined: int; 33 var_type: *type; 34 35 goto_defined: int; 36 goto_label: *label; 37 } 38 39 func find(c: *compiler, name: *byte, member_name: *byte, make: int): *decl { 40 var link: **rbnode; 41 var p: *rbnode; 42 var d: *decl; 43 var dir: int; 44 45 p = nil; 46 link = (&c.decls) as **rbnode; 47 loop { 48 d = (*link) as *decl; 49 if (!d) { 50 break; 51 } 52 53 dir = strcmp(name, d.name); 54 55 if (dir == 0) { 56 if (!member_name && !d.member_name) { 57 dir = 0; 58 } else if (!member_name) { 59 dir = -1; 60 } else if (!d.member_name) { 61 dir = 1; 62 } else { 63 dir = strcmp(member_name, d.member_name); 64 } 65 } 66 67 if (dir < 0) { 68 link = &d.node.left; 69 p = &d.node; 70 } else if (dir > 0) { 71 link = &d.node.right; 72 p = &d.node; 73 } else { 74 return d; 75 } 76 } 77 78 79 if (!make) { 80 return nil; 81 } 82 83 d = alloc(c.a, sizeof(*d)) as *decl; 84 85 d.name = name; 86 d.member_name = member_name; 87 88 rb_link((&c.decls) as **rbnode, link, p, &d.node); 89 90 d.used_next = nil; 91 92 d.func_defined = 0; 93 d.func_type = nil; 94 d.func_label = mklabel(c.s); 95 d.func_used = 0; 96 97 d.struct_defined = 0; 98 d.struct_size = 0; 99 d.struct_layout_done = 0; 100 101 d.member_defined = 0; 102 d.member_type = nil; 103 d.member_offset = 0; 104 105 d.enum_defined = 0; 106 d.enum_value = 0; 107 108 d.var_defined = 0; 109 d.var_type = nil; 110 111 d.goto_defined = 0; 112 d.goto_label = mklabel(c.s); 113 114 return d; 115 } 116 117 // Find the first declaration 118 func first_decl(c: *compiler): *decl { 119 if !c.decls { 120 return nil; 121 } 122 return rb_first(&c.decls.node) as *decl; 123 } 124 125 func next_decl(c: *compiler, d: *decl): *decl { 126 return rb_next(&d.node) as *decl; 127 }