os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

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 }